python:从dict中删除重复的值

时间:2017-06-06 16:45:07

标签: python dictionary duplicates

我试图删除我的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']}

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

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

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

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

正如@CoryKramer在评论中所说,这里给出的解决方案不会(一般来说)保留值列表中项目的顺序。如果这对你来说很重要,你就必须使用别的东西。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

你可以试试这个:

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()}

答案 3 :(得分:1)

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

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')然后检查值是否在值中(显然它有成为)。我所做的基本上是迭代密钥本身的值。