如何根据字符串中的值删除列表中的字典项

时间:2019-04-16 11:36:39

标签: python regex python-2.7 list data-manipulation

我正忙于使用python 2.7提取数据 到目前为止,我得到了一个列表,其中有字典作为项目。 在两天内,我对此无能为力。

数据:

list = [
    {
        'displayName': '#12',
        'timestamp': 1543588481684,
        'number': 12,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #12'
    },
    {   
        'displayName': '#64',
        'timestamp': 1544432646765,
        'number': 64,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Development Virtual Host Deploy #64'
    },
    {
        'displayName': '#15',
        'timestamp': 1544432258338,
        'number': 15,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #15'
    },
    {   
        'displayName': '#61',
        'timestamp': 1554186520499,
        'number': 61,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.0 #61'
    },
    {   
        'displayName': '#5',
        'timestamp': 1554274310468,
        'number': 5,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.2 #5'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554289674392,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.3 #1'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554290695120,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.4 #1'
    },
    {   'displayName': '#1',
        'timestamp': 1554292855198,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.5 #1'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554381545158,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.7 #1'
    },
    {   'displayName': '#2',
        'timestamp': 1554191277415,
        'number': 2,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.0 #2'
    },
    {   'displayName': '#6',
        'timestamp': 1554212133716,
        'number': 6,
        'result': 'FAILURE',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.1 #6'
    }
]

我想删除列表中的字典项,其中'fullDisplayName'包含('hotfix','tag'),但保留最后一个列表项(具有最高版本值的字典(hotfix / 1.0。?))。

预期输出:

list = [
    {
        'displayName': '#12',
        'timestamp': 1543588481684,
        'number': 12,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #12'
    },
    {   
        'displayName': '#64',
        'timestamp': 1544432646765,
        'number': 64,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Development Virtual Host Deploy #64'
    },
    {
        'displayName': '#15',
        'timestamp': 1544432258338,
        'number': 15,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #15'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554381545158,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.7 #1'
    },
    {   'displayName': '#6',
        'timestamp': 1554212133716,
        'number': 6,
        'result': 'FAILURE',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.1 #6'
    }
]

希望有人可以指出我正确的方向。

谢谢

4 个答案:

答案 0 :(得分:1)

  1. 寻找所需的关键字
  2. 检查更高版本
  3. 如有必要,删除项目

伪代码:

for item in list:
    if dictContainsKeyword(item, "hotfix") or dictContainsKeyword(item, "tag"):
        if listContainsNewerVersion(list, item):
            removeDictFromList(list, item)

对于dictContainsKeyword,listContainsNewerVersion和removeDictFromList,您需要选择字典中具有唯一值的属性。或使用一组属性来标识单个字典。

在listContainsNewerVersion中,您可以遍历列表并比较给定词典。

编辑:更改为每个循环,以避免列表迭代和删除对象出现问题。

答案 1 :(得分:0)

您可以尝试以下方法,虽然效率不高,但可以解决您的问题

>>> list1 = [i for i in list if 'tag' not in i['fullDisplayName']]
>>> list2 = [i for i in list if 'tag' in i['fullDisplayName']]
>>> from operator import itemgetter
>>> newlist = sorted(list2, key=itemgetter('displayName'), reverse=True)
>>> list1.append(newlist[0])

答案 2 :(得分:0)

执行以下操作:

new_list = []
append_last = (0, None)
for index, obj in enumerate(list):
    if 'hotfix' in obj['fullDisplayName'] or 'tag' in obj['fullDisplayName']:
        number = int("tag/1.0.1".split('/')[1].replace('.',''))
        append_last = (number, index) if append_last[0] < number else append_last
    else:
        new_list.append(obj)
if append_last[1]:
    new_list.append(list[append_last[1]])
print new_list

答案 3 :(得分:0)

假设我们的原件称为my_list,而我们需要限制的值存储在restricted

my_list = [
    {
        'displayName': '#12',
        'timestamp': 1543588481684,
        'number': 12,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #12'
    },
    ...
]
restricted = ['hotfix','tag']

首先,我们需要找到编号最大的字典,我们将使用max()并将key设置为根据['number']的最大值来查找字典。

highest = max(my_list, key=lambda x: x['number'])

我们可以使用python内置函数filter()来过滤掉特定的字典。为此,我们将在此处my_filter()定义决定某个词典是否有效的函数。

def my_filter(x):
    # check if provided dict is one with the highest value
    if x == highest:
        return True

    # check if ['fullDisplayName'] doesn't contains any of resticted words
    if not any(i in x['fullDisplayName'] for i in restricted):
        return True

    return False

new_list = list(filter(my_filter, my_list))

或者在一行中将过滤器功能用作lambda

new_list = list(filter(lambda x: x==highest or not any(i in x['fullDisplayName'] for i in restricted), my_list))