我正忙于使用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'
}
]
希望有人可以指出我正确的方向。
谢谢
答案 0 :(得分:1)
伪代码:
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))