Python:创建一个字典,其中键有多个值
我遇到的问题很难解释,也很容易理解: 我有一个元组列表:Python:创建一个字典,其中键有多个值,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我遇到的问题很难解释,也很容易理解: 我有一个元组列表: L=[('a','111'),('b','222'),('a','333'),('b','444')] 从这个列表中,我想创建一个字典,其中键是元组('a'和'b')的第一个元素,关联的值在一个列表中: 预期产出: {'a':['111','333'],'b':['222','444']} 我怎样才能解决这个问题 d={} for x in range (len(L)): d[L[x][0]]=[L[x][1]] return
L=[('a','111'),('b','222'),('a','333'),('b','444')]
从这个列表中,我想创建一个字典,其中键是元组('a'和'b')的第一个元素,关联的值在一个列表中:
预期产出:
{'a':['111','333'],'b':['222','444']}
我怎样才能解决这个问题
d={}
for x in range (len(L)):
d[L[x][0]]=[L[x][1]]
return d
但是,正如您很容易理解的那样,输出将不完整,因为列表将仅显示与该键关联的最后一个值,您可以使用该值首次在dict中设置该键。然后附加您的值:
L=[('a','111'),('b','222'),('a','333'),('b','444')]
d = {}
for key, value in L:
d.setdefault(key, []).append(value)
print(d)
# {'a': ['111', '333'], 'b': ['222', '444']}
您必须将
L[x][1]
附加到现有列表中,而不是用新的单例列表替换其中的任何内容
d={}
for x in range (len(L)):
if L[x][0] not in d:
d[L[x][0]] = []
d[L[x][0]].append(L[x][1])
return d
一个defaultdict
使这更容易:
from collections import defaultdict
d = defaultdict(list)
for x in range(len(L)):
d[L[x][0]].append(L[x][1])
return d
一种更惯用的写作风格是直接迭代列表
,并立即解包键和值:
d = defaultdict(list)
for key, value in L:
d[key].append(value)
您可以尝试以下方法:
L = [('a','111'),('b','222'),('a','333'),('b','444')]
my_dict = {}
for item in L:
if item[0] not in my_dict:
my_dict[item[0]] = []
my_dict[item[0]].append(item[1])
print(my_dict)
输出:
python your_script.py
{'a': ['111', '333'], 'b': ['222', '444']}
正如@chepner所指出的,您可以使用
基本上,使用defaultdict
,您不需要检查dict
中是否还没有键
因此,这将是:
L = [('a','111'),('b','222'),('a','333'),('b','444')]
my_dict = defaultdict(list)
for item in L:
my_dict[item[0]].append(item[1])
print(my_dict)
以及输出:
defaultdict(<class 'list'>, {'a': ['111', '333'], 'b': ['222', '444']})
输出将是:
{'a': ['111', '333'], 'b': ['222', '444']}
这一问题在
集合的一个示例中得到了解决。defaultdict
:根据我的经验,defaultdict基本上取代了setdefault
的需要,但如果您想坚持使用核心Dict,这是一种方法。没有办法从输出中删除('defaultdict())?是的,有。您只需从中创建一个新的dict:print(dict(my_dict))无法从输出中删除“defaultdict(,”?您可以在完成后使用d=dict(d)
创建一个常规dict,但通常您不关心对象本身的字符串表示形式。
{'a': ['111', '333'], 'b': ['222', '444']}