我正忙着用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'
}
]
希望有人能指出我正确的方向。
谢谢
伪代码:
for item in list:
if dictContainsKeyword(item, "hotfix") or dictContainsKeyword(item, "tag"):
if listContainsNewerVersion(list, item):
removeDictFromList(list, item)
对于dictContainsKeyword,listContainsNewerVersion和removeDictFromList,您需要选择具有唯一值的字典属性。或者使用一组属性来标识单个字典。
在listContainsNewerVersion中,您可以遍历列表并将字典与给定的字典进行比较。
编辑:更改为每个循环以避免列表迭代和删除对象的问题。
您可以尝试类似下面的方法,效率不高但它会解决您的问题
>>> 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])
做这样的事情:
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
假设我们的原始名为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))