我有两个清单:
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中的值来搜索我正在读取的行,那么使用集合或数组会更容易吗?
答案 0 :(得分:11)
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