他是一个有趣的问题,寻找最 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 的先前条目
如果您不介意,那么我建议使用上面的解决方案。在其他情况下,此函数会保留顺序并优先处理首次遇到的 ID:
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))
调用它。
关于python - 从映射列表中提取唯一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/186131/