代码之家  ›  专栏  ›  技术社区  ›  Luca

在字典列表中查找重复项[重复]

  •  1
  • Luca  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一个关于字典的python列表,可以是:

    l = [{'id': 'scissor'}, {'id': 'cloth'}, {'id': 'scissor'}]
    

    现在,我想知道是否有一种有效的方法可以从这个列表中删除重复项。所以结果应该是:

    r = [{'id': 'scissor'}, {'id': 'cloth'}]
    

    我试着用 frozenset 但是字典类型不能散列。有没有一种有效的方法可以从Python库中的任何结构中做到这一点?

    编辑 如果听写完全相同,则认为这些项目是重复的。

    5 回复  |  直到 6 年前
        1
  •  2
  •   Reut Sharabani    6 年前

    如果你不需要提高效率:

    from functools import partial
    import json
    
    list(map(json.loads, set(map(partial(json.dumps, sort_keys=True), l))))
    

    如果你必须提高效率:

    serialized = map(tuple, map(sorted, map(dict.items, l)))
    unique = set(serialized)
    result = list(map(dict, unique))
    
        2
  •  1
  •   Bernhard    6 年前

    应该工作:

    l2 = []
    
    for d in l:
        if d not in l2:
            l2.append(d)
    
        3
  •  1
  •   Elisha    6 年前
    r = [x for i,x in enumerate(l) if x not in l[:i]]
    
        4
  •  0
  •   blhsing    6 年前

    集合项必须是可哈希的,而dict则不是。你可以使用 pickle 要序列化所有听写,请使用 set 要获取唯一项,并最终将其反序列化回dicts:

    import pickle
    print(list(map(pickle.loads, set(map(pickle.dumps, l)))))
    

    此输出:

    [{'id': 'cloth'}, {'id': 'scissor'}]
    
        5
  •  0
  •   Laurent H. chthonicdaemon    6 年前

    我最简单的方法是:

    l = [{'id': 'scissor'}, {'id': 'cloth'}, {'id': 'scissor'}]
    
    r= []
    for i in l:
        if i not in r:
            r.append(i)
    
    print(r)   # [{'id': 'scissor'}, {'id': 'cloth'}]