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