如何从两个列表创建字典而不会丢失重复值?

时间:2013-01-14 21:41:50

标签: python list dictionary

我有两个清单:

pin_list = ['in0', 'in1', 'in2', 'y']
delvt_list = ['0.399', '0.1995', '0.1995', '0.399']

我使用的代码: temp = dict(zip(delvt_list,pin_list))但我得到以下内容:

temp = {'0.1995': 'in2', '0.399': 'y'}

我需要写什么python代码才能获得:

 temp =  {'0.1995': {'in2','in1'}, '0.399': {'y','in0'}}

编辑:我没有做太多的python编码,所以我不熟悉集合,可能需要格式化:

temp =  {'0.1995': ['in2','in1'], '0.399': ['y','in0']}

作为一个额外的问题,如果我想使用temp中的值来搜索我正在读取的行,那么使用集合或数组会更容易吗?

2 个答案:

答案 0 :(得分:11)

使用collections.defaultdict

temp = defaultdict(set)

for delvt, pin in zip(delvt_list, pin_list):
    temp[delvt].add(pin)

这会创建一个defaultdict,其中默认值是一个集合,然后循环并添加每个键的值。

如果您想要一个列表,只需更改默认类型以及如何添加值以匹配list接口:

temp = defaultdict(list)

for delvt, pin in zip(delvt_list, pin_list):
    temp[delvt].append(pin)

当您想要测试成员资格时,集合是更好的主意(something in aset);这样的测试需要恒定的时间,而不是列表的线性时间(因此设置成员资格测试需要一个固定的时间,与集合的大小无关,而对于列表,它需要更多的时间,与列表中的元素数量成比例)

答案 1 :(得分:4)

您可以使用dict.setdefault()

In [20]: pin_list = ['in0', 'in1', 'in2', 'y']

In [21]: delvt_list = ['0.399', '0.1995', '0.1995', '0.399']

In [22]: dic={}

In [23]: for x,y in zip(pin_list,delvt_list):
    dic.setdefault(y,[]).append(x)
   ....:     

In [24]: dic
Out[24]: {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']}

或者如果你想要基于set的输出:

In [29]: dic={}

In [30]: for x,y in zip(pin_list,delvt_list):
    dic.setdefault(y,set()).add(x)
   ....:     

In [31]: dic
Out[31]: {'0.1995': set(['in1', 'in2']), '0.399': set(['y', 'in0'])}
help()上的

dict.setdefault

D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D