如何从字典中删除重复的值?

3

我正在尝试删除字典中的重复值,但没有成功:

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']}

3
你是否关心在删除重复项时维护列表的顺序? - Cory Kramer
不,我不在意顺序。 - bioinf80
4个回答

5
您可以尝试这个方法:
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()}

2
除非绝对需要再次将其转换为列表,否则我会省略list类型转换。 - Brian M. Sheldon

3
下面的字典推导将从原始字典中创建一个新字典,没有任何重复的值:
samples_antibiotics = {k: list(set(v)) for k, v in samples_antibiotics_with_duplicates.items()}

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

正如@CoryKramer在评论中所说,此处给出的解决方案通常不会保留值列表中项目的顺序。如果这对您很重要,您需要选择其他方法。


你应该迭代 .items(),否则按照原来的写法,你将会遍历字典的 .keys() - Cory Kramer
1
它需要使用samples_antibiotics_with_duplicates.items()。 - bioinf80

3

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

如果您想保留原始顺序,则使用list(OrderedDict.fromkeys(my_list))


2

在其他帖子中,有更好的方法来完成这个任务。但是为了尽可能保留您原始代码的大部分内容,并解释为什么它不能正常工作,请改用以下代码:

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”),然后检查值是否在值中(显然必须是)。我所做的是基本上在键本身内迭代值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接