【问题标题】:Remove duplicate from dictionary in python从python中的字典中删除重复项
【发布时间】:2021-12-22 18:58:37
【问题描述】:

我在字典中有 5 个列表,我想通过比较所有可用列表来删除重复项并保留第一个列表中出现的元素

dict = {1:[0,1,2,3], 2:[1,4,5], 3:[0,4,2,5,6], 4:[0,2,7,8], 5:[9]}

输出应如下所示:

dict = {1:[0,1,2,3], 2:[4,5], 3:[6], 4:[7,8], 5:[9]}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 也不是说字典中的键/值没有实际顺序。如果我在查看 1 之前查看 2,会发生什么情况。您是否需要对键进行数字排序?
  • @sahasrara62 我尝试在字典上运行一个循环,将它们存储在两个单独的变量中并使用集合操作进行比较
  • @FrankYellin 从 python 3.7 开始,dict 确实保留了顺序。
  • @j1-lee。你是对的。在 3.6 中,这是 CPython 的一个实现细节。但我看到在 3.7 中,它已被正式发布。谢谢指正。

标签: python list dictionary duplicates


【解决方案1】:

你可以做一个set来存储已经看过的item,然后根据set依次更新dict:

d = {1:[0,1,2,3], 2:[1,4,5], 3:[0,4,2,5,6], 4:[0,2,7,8], 5:[9]}

seen = set()
for k, v in d.items():
    d[k] = [x for x in v if x not in seen]
    seen.update(d[k])

print(d) # {1: [0, 1, 2, 3], 2: [4, 5], 3: [6], 4: [7, 8], 5: [9]}

【讨论】:

    【解决方案2】:

    具有字典理解的单行:

    >>> {k: [i for i in v if i not in sum(list(dct.values())[:idx], [])] for idx, (k, v) in enumerate(dct.items())}
    {1: [0, 1, 2, 3], 2: [4, 5], 3: [6], 4: [7, 8], 5: [9]}
    >>> 
    

    它过滤和展平列表中特定键之前的所有值,并过滤不存在​​的值。

    附注我将您的 dict 重命名为 dct,因此它不会覆盖函数名称

    【讨论】:

    • 很好,不仅是二次的,而且是 cubic 运行时。你能让它四次吗? :-P
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 2016-03-14
    • 2016-03-13
    • 2017-01-22
    • 2017-08-13
    • 2016-06-11
    • 2018-06-05
    相关资源
    最近更新 更多