[英]Python. Adding multiple items to keys in a dict
我正在尝试从一组唯一值构建一个dict作为键和一个压缩的元组列表来提供项目。
set = ("a","b","c")
lst 1 =("a","a","b","b","c","d","d")
lst 2 =(1,2,3,3,4,5,6,)
zip = [("a",1),("a",2),("b",3),("b",3),("c",4),("d",5)("d",6)
dct = {"a":1,2 "b":3,3 "c":4 "d":5,6}
但我得到:
dct = {"a":1,"b":3,"c":4,"d":5}
这是我目前的代码:
#make two lists
rtList = ["EVT","EVT","EVT","EVT","EVT","EVT","EVT","HIL"]
raList = ["C64G","C64R","C64O","C32G","C96G","C96R","C96O","RA96O"]
# make a set of unique codes in the first list
routes = set()
for r in rtList:
routes.add(r)
#zip the lists
RtRaList = zip(rtList,raList)
#print RtRaList
# make a dictionary with list one as the keys and list two as the values
SrvCodeDct = {}
for key, item in RtRaList:
for r in routes:
if r == key:
SrvCodeDct[r] = item
for key, item in SrvCodeDct.items():
print key, item
你不需要任何这些。 只需使用collections.defaultdict
。
import collections
rtList = ["EVT","EVT","EVT","EVT","EVT","EVT","EVT","HIL"]
raList = ["C64G","C64R","C64O","C32G","C96G","C96R","C96O","RA96O"]
d = collections.defaultdict(list)
for k,v in zip(rtList, raList):
d[k].append(v)
您可以使用dict.setdefault
方法实现此dict.setdefault
:
my_dict = {}
for i, j in zip(l1, l2):
my_dict.setdefault(i, []).append(j)
这将返回my_dict
值为:
>>> my_dict
{'a': [1, 2], 'c': [4], 'b': [3, 3], 'd': [5, 6]}
或者,使用collections.defaultdict
由TigerhawkT3提及。
您的代码问题:您没有检查现有key
。 每次执行SrvCodeDct[r] = item
,都会使用item
值更新r
key的先前值。 为了解决这个问题,必须添加if
条件为:
l1 = ("a","a","b","b","c","d","d")
l2 = (1,2,3,3,4,5,6,)
my_dict = {}
for i, j in zip(l1, l2):
if i in my_dict: # your `if` check
my_dict[i].append(j) # append value to existing list
else:
my_dict[i] = [j]
>>> my_dict
{'a': [1, 2], 'c': [4], 'b': [3, 3], 'd': [5, 6]}
但是,可以使用collections.defaultdict
(如TigerhawkT3所述)或使用dict.setdefault
方法简化此代码:
my_dict = {}
for i, j in zip(l1, l2):
my_dict.setdefault(i, []).append(j)
在dict
,所有键都是唯一的,每个键只能有一个值。
解决这个问题的最简单方法是将字典的值作为list
,以模拟所谓的多图。 在列表中,您拥有按键映射到的所有元素。
编辑:
您可能想要查看此PyPI包: https ://pypi.python.org/pypi/multidict
然而,在引擎盖下,它可能如上所述起作用。
Afaik,没有任何内置支持你所追求的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.