如何在Python中将[[A,B],[A,C],[A,D]]列表转换为{A:[B,C,D]}字典?

时间:2018-04-27 11:41:53

标签: python

想象一下,我们有一个列表列表,其中嵌套列表包含两个元素[A,B]。现在,您希望将此类列表转换为字典,其中第一个元素应该是键,第二个元素应该是其值。例如:

[['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2']] -->

{'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}

应保留值的顺序。

我有一个简单的解决方案:

lst = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['C', 'C1']]
dic = {}
for el in lst:
    if dic.get(el[0]) is None:
        dic[el[0]] = [el[1]]
        continue
    dic[el[0]].append(el[1])

一个丑陋的列表理解解决方案,因为它为每个单独的密钥执行完整数据的循环,因此速度明显变慢。

dic = dict([(el[0], [e[1] for r in lst if e[0] == el[0]])
            for el in lst])

应该有更好,更优雅的方式来做到这一点。你能想出点什么吗?

3 个答案:

答案 0 :(得分:6)

使用defaultdict:

from collections import defaultdict
dic = defaultdict(list)
for k, v in lst:
    dic[k].append(v)

答案 1 :(得分:2)

defaultdict的替代方法是使用普通dict的{​​{3}}方法。

lst = [
    ['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'],
    ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2'],
]

dic = {}
for key, val in lst:
    dic.setdefault(key, []).append(val)
print(dic)

<强>输出

{'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}

这将保留所有Python版本中值的顺序,而在Python 3.6+中它也将保留键的顺序。

答案 2 :(得分:0)

另一种方法是:

l = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2']]

d = dict((elem[0],[]) for elem in l)
for elem in l:
    d[elem[0]].append(elem[1])
print(d)

输出:

{'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}