python - 从映射列表中提取唯一项

标签 python unique duplicate-data

他是一个有趣的问题,寻找最 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/

相关文章:

python - 检查字典的链式实现中的值

python - 如何使用 pywin32 模拟按住

python - 无法从 CSV 中提取独特的单词

php - 如果名称不存在,则将名称插入表中

c# - 加密随机唯一字符串

python - 使用特征张量复制 TensorFlows Conv2D 操作

python - If 语句始终打印 (Python)

SQL 对数百万行的性能重复删除查询

sql - 使用 Clustered ColumnStore Index 插入唯一值

R,查找重复的行,无论顺序如何