我是python的新手,我遇到了以下问题需要解决。
我有一个字典列表,其中包含重复的name
值,例如:reel1
。
我需要在新列表中附加具有唯一名称的字典,因为我使用的是version
个最大的数字,在这种情况下reel1
版本10
store = [
{'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '09', 'name': 'reel1'},
{'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'},
{'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'}
]
结果应该是这样的。
result = [
{'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'},
{'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'}
]
非常感谢你的帮助。
答案 0 :(得分:4)
这样做:
store = [
{'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '09', 'name': 'reel1'},
{'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'},
{'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'}
]
l = [reduce(lambda x, y: x if int(x['version']) > int(y['version']) else y, filter(lambda e: e['url'] == n, store)) for n in {d['url'] for d in store}]
print l
[{'url': 'n0:project:film:reel2_c09', 'range': None, 'version': '09', 'name': 'reel2'}, {'url': 'n0:project:film:reel1_c09', 'range': '12-120', 'version': '10', 'name': 'reel1'}]
解释代码:
设置url
并为其中的每一个过滤重复项的商店列表,并采用最大的版本减少该子列表。
按部分扩展:
在商店列表中获取唯一的网址值:
{d['url'] for d in store}
收集所有重复的内容并将它们列在一起:
filter(lambda e: e['url'] == n, store))
使用重复项减少每个子列表并使用更高版本的子列表:
reduce(lambda x, y: x if int(x['version']) > int(y['version']) else y