2017-06-06 148 views
1

我想在我的字典中删除重复值,但其没有工作删除重复值:蟒蛇:从字典

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

任何帮助将不胜感激。

+2

您是否在意删除重复项时维护列表的顺序? – CoryKramer

+0

不,我不关心订单 – bioinf80

回答

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

除非绝对需要将它重新列表,否则我会省略'list'类型转换。 –

3

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

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

set版本列表(或容器)不包含任何重复,因为集合不允许任何(这就是为什么他们需要像dicts一样可排除物品)。

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

+0

它给出了一个错误:ValueError:太多的值来解压 – bioinf80

+0

你应该迭代'.items()',否则就像你正在迭代字典的'.keys()' – CoryKramer

+1

它需要是samples_antibiotics_with_duplicates.items() – bioinf80

3

如果你不在乎保留原来的订单,那么set(my_list)将删除所有重复项。

如果你想保留原来的顺序,然后list(OrderedDict.fromkeys(my_list))

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