4

我有两个清单:

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

或者

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

作为一个额外的问题,如果我想使用其中的值temp来搜索我正在阅读的行,使用集合或列表会更容易吗?

4

2 回答 2

13

使用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);这样的测试需要恒定的时间,而不是列表的线性时间(因此集合成员资格测试需要固定的时间量,与集合的大小无关,而对于列表,它需要更多的时间,与列表中的元素数量成正比) .

于 2013-01-14T21:43:42.427 回答
5

你可以使用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
于 2013-01-14T21:45:54.340 回答