我有一个元组列表,如下所示:
lt = [(1,'a'),(1,'b'),(2,'a'),(3,'b'),(3,'c')]
我想制作字典的数字键,并使其指向列表。然后,该列表将所有关联保留在元组列表中。因此,在上面的列表中,它将拆分为以下字典:
dict_lt:{
1:[a,b],
2:[a],
3:[b,c]
}
当前,我使用字典的灵活性来自动声明新键,然后我将其强制指向空列表。然后,我相应地填写该列表。
dict_lt = {}
for tup in lt:
dict_lt[tup[0]] = []
for tup in lt:
dict_lt[tup[0]].append(tup[1])
这可以正常工作,但是有点慢,因为它需要在同一列表上进行两次迭代,并且似乎整体上是多余的。有更好的方法吗?
答案 0 :(得分:5)
您不需要重复两次该列表。如果密钥不在字典中,则可以使用setdefault()
设置初始值:
lt = [(1,'a'),(1,'b'),(2,'a'),(3,'b'),(3,'c')]
d = {}
for k, v in lt:
d.setdefault(k, []).append(v)
print(d)
打印
{1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']}
答案 1 :(得分:2)
您可以将collections.defaultdict
与list
工厂一起使用,也可以将dict.setdefault
与列表一起使用,以将值附加到列表上。
collections.defaultdict
:
out = collections.defaultdict(list)
for k, v in lt:
out[k].append(v)
dict.setdefault
:
out = {}
for k, v in lt:
out.setdefault(k, []).append(v)
示例:
In [11]: lt = [(1, 'a'),(1, 'b'),(2, 'a'),(3, 'b'),(3, 'c')]
In [12]: out = {}
In [13]: for k, v in lt:
...: out.setdefault(k, []).append(v)
...:
In [14]: out
Out[14]: {1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']}
In [15]: out = collections.defaultdict(list)
In [16]: for k, v in lt:
...: out[k].append(v)
...:
...:
In [17]: out
Out[17]: defaultdict(list, {1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']})
答案 2 :(得分:1)
您可以在代码中使用defaultdict(list)
而不是dict
,而只需省略第一个循环。
from collections import defaultdict
dict_lt = defaultdict(list)
for tup in lt:
dict_lt[tup[0]].append(tup[1])