从映射列表中提取唯一项目

他是一个寻找最多Pythonic解决方案的有趣问题。假设我有一个映射列表{'id': id, 'url': url}。列表中的某些id是重复的,我想创建一个新列表,删除所有重复项。我想出了以下功能:从映射列表中提取唯一项目

def unique_mapping(map): 

d = {}

for res in map:

d[res['id']] = res['url']

return [{'id': id, 'url': d[id]} for id in d]

我想这是非常有效的。但是有没有“更多Pythonic”的方式?或者也许更有效的方法?

回答:

您的示例可以稍微重写,以使用生成器表达式构造第一个字典并删除构建其他映射的必要性。只重用旧的:

def unique_mapping(mappings): 

return dict((m['id'], m) for m in mappings).values()

虽然这是一个单线程,但我仍然认为它是非常可读的。

还有你必须使用你原来的解决方案,我的时候要记住两两件事:

  • 的项目不会总是在他们原先
  • 后来的条目将覆盖相同的顺序返回先前使用相同ID的条目

如果您不介意,那么我建议您使用上面的解决方案。在其他情况下,该功能保留顺序和对待第一个遇到的IDS优先:

def unique_mapping(mappings): 

addedIds = set()

for m in mappings:

mId = m['id']

if mId not in addedIds:

addedIds.add(mId)

yield m

您可能需要如果你需要一个列表,而不是一台发电机与list(unique_mappings(mappings))调用它。

回答:

有几件事情可以改进。

  • 你进行两个循环,一个比原来的字典,然后再对结果字典。相反,您可以一步完成您的结果。

  • 您可以更改为使用生成器,以避免预先构建整个列表。 (如果需要,使用列表(unique_mapping(items))转换为完整列表)

  • 当您只需检查重复项时,不需要存储该值,您可以使用集合。

  • 您正在为每个元素重新创建字典,而不是返回原件。这实际上可能是需要的(例如,你正在修改它们,而不想触摸原始的),但是如果不是,它会更有效地使用已经创建的字典。

下面是一个实现:

def unique_mapping(items): 

s = set()

for res in items:

if res['id'] not in s:

yield res

s.add(res['id'])

回答:

我认为这是可以做简单一些。字典不能容忍重复的密钥。将映射列表映射到映射字典中。这将删除重复项。

>>> someListOfDicts= [ 

{'url': 'http://a', 'id': 'a'},

{'url': 'http://b', 'id': 'b'},

{'url': 'http://c', 'id': 'a'}]

>>> dict([(x['id'],x) for x in someListOfDicts ]).values()

[{'url': 'http://c', 'id': 'a'}, {'url': 'http://b', 'id': 'b'}]

以上是 从映射列表中提取唯一项目 的全部内容, 来源链接: utcz.com/qa/257166.html

回到顶部