【问题标题】:How to remove duplicate values from dict?如何从dict中删除重复值?
【发布时间】:2017-11-07 19:09:24
【问题描述】:

我正在尝试删除我的 dict 中的重复值,但它不起作用:

samples_antibiotics_with_duplicates = {'S00541-09': ['Streptomycin', 'Sulfamethoxazole', 'Trimethoprim', 'Spectinomycin', 'Streptomycin', 'Streptomycin', 'Trimethoprim']}
samples_antibiotics = {}
    for key,value in samples_antibiotics_with_duplicates.iteritems():
      if value not in samples_antibiotics.values():
        samples_antibiotics[key] = value
print samples_antibiotics

打印出来:

{'S00541-09': ['Streptomycin', 'Sulfamethoxazole', 'Trimethoprim', 'Spectinomycin', 'Streptomycin', 'Streptomycin', 'Trimethoprim']}

【问题讨论】:

  • 您是否关心在删除重复项时维护列表的顺序?
  • 不,我不在乎订单

标签: python dictionary duplicates


【解决方案1】:

你可以试试这个:

samples_antibiotics_with_duplicates = {'S00541-09': ['Streptomycin', 'Sulfamethoxazole', 'Trimethoprim', 'Spectinomycin', 'Streptomycin', 'Streptomycin', 'Trimethoprim']}

new_dict = {a:list(set(b)) for a, b in samples_antibiotics_with_duplicatates.items()}

【讨论】:

  • 除非绝对需要再次列出它,否则我会省略 list 类型转换。
【解决方案2】:

如果您不关心保留原始订单,那么set(my_list) 将删除所有重复项。

如果您想保留原始订单,那么list(OrderedDict.fromkeys(my_list))

【讨论】:

    【解决方案3】:

    下面的 dict 理解将从原始字典创建一个新的字典,没有任何重复值:

    samples_antibiotics = {k: list(set(v)) for k, v in samples_antibiotics_with_duplicates.items()}
    

    set 版本的列表(或任何容器)不包含任何重复项,因为集合不允许任何重复项(这就是为什么它们需要像字典一样的可散列项)。

    正如@CoryKramer 在 cmets 中所说,这里给出的解决方案(一般来说)不会保留值列表中项目的顺序。如果这对您很重要,您将不得不选择其他东西。

    【讨论】:

    • 你应该迭代.items(),否则你正在迭代字典的.keys()
    • 需要是samples_antibiotics_with_duplicates.items()
    【解决方案4】:

    如其他帖子所示,有更好的方法来做到这一点。但是要尽可能多地保留原始代码,同时解释为什么它不起作用,请改用:

    samples_antibiotics_with_duplicates = {'S00541-09': ['Streptomycin', 'Sulfamethoxazole', 'Trimethoprim', 'Spectinomycin', 'Streptomycin', 'Streptomycin', 'Trimethoprim']}
    samples_antibiotics = {}
    for key,value in samples_antibiotics_with_duplicates.items():
        samples_antibiotics[key] = set(value)
    print(samples_antibiotics)
    

    问题是您在 for 循环中遍历字典中的每个键(因此只有“S00541-09”),然后检查值是否在值中(显然必须如此)。我所做的基本上是在键本身内迭代值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2011-03-25
      • 2018-04-27
      • 1970-01-01
      • 2021-12-26
      • 2019-12-08
      • 2019-09-22
      相关资源
      最近更新 更多