Python,将元组列表拆分为字典

时间:2019-07-15 17:59:25

标签: python list dictionary tuples

我有一个元组列表,如下所示:

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])

这可以正常工作,但是有点慢,因为它需要在同一列表上进行两次迭代,并且似乎整体上是多余的。有更好的方法吗?

3 个答案:

答案 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.defaultdictlist工厂一起使用,也可以将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])