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

Jon*_* A. 3 python dictionary list set

我有两个清单:

pin_list = ['in0', 'in1', 'in2', 'y']
delvt_list = ['0.399', '0.1995', '0.1995', '0.399']
Run Code Online (Sandbox Code Playgroud)

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

temp = {'0.1995': 'in2', '0.399': 'y'}
Run Code Online (Sandbox Code Playgroud)

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

temp =  {'0.1995': {'in2', 'in1'}, '0.399': {'y', 'in0'}}
Run Code Online (Sandbox Code Playgroud)

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

temp =  {'0.1995': ['in2', 'in1'], '0.399': ['y', 'in0']}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 12

用途collections.defaultdict:

temp = defaultdict(set)

for delvt, pin in zip(delvt_list, pin_list):
    temp[delvt].add(pin)
Run Code Online (Sandbox Code Playgroud)

这将创建defaultdict默认值为集合的位置,然后循环并添加每个键的值.

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

temp = defaultdict(list)

for delvt, pin in zip(delvt_list, pin_list):
    temp[delvt].append(pin)
Run Code Online (Sandbox Code Playgroud)

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


Ash*_*ary 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']}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要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'])}
Run Code Online (Sandbox Code Playgroud)

help()dict.setdefault

D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
Run Code Online (Sandbox Code Playgroud)