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

问题描述 投票:0回答:4

我正忙着用python 2.7提取数据到目前为止,我得到了一个列表,其中包含字典作为项目。这2天我无法继续这样做。

数据:

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'
    }
]

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

谢谢

python regex python-2.7 list data-manipulation
4个回答
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中,您可以遍历列表并将字典与给定的字典进行比较。

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


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])

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

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))
© www.soinside.com 2019 - 2024. All rights reserved.