过滤python重复列表

时间:2015-12-14 09:00:12

标签: python

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

非常感谢你的帮助。

1 个答案:

答案 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