如何根据第一个和第二个值将列表分成字典

How to separate a list into dictionary based on first and second values

我不确定如何准确表达我的问题,所以我将在这里进行更深入的讨论。

我想做的是使用如下列表的输入在 Python 中执行图表着色问题:

[('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]

这是表示图中每条边的"neighbors",这样A是B C & D的邻居,B是C的邻居,C是D的邻居

现在,我要做的是将它们分解成字典中的键,如下所示:

neighbors = {}
neighbors['A'] = ['B', 'C', 'D']
neighbors['B'] = ['A', 'C']
neighbors['C'] = ['A', 'B', 'D']
neighbors['D'] = ['A', 'C']

我遇到的问题是将初始输入分解为每个键字典的多值。到目前为止我有这个:

neighbours = {}
myList = [('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
for i in myList:
    neighbours[i[0]] = (i[1])

print(neighbours)

这提供了输出:

{'A': 'D', 'C': 'D', 'B': 'C'}

但我希望它看起来像这样:

{'A': ['B','C','D'], 'B': ['A','C'], 'C': ['A','B','D'], 'D': ['A','C']}

非常感谢任何帮助!谢谢:)

>>> l = [('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
>>> 
>>> d = {}
>>> for i in l:
...     temp = d.get(i[0], [])
...     temp.append(i[1])
...     d[i[0]] = temp

为什么不创建一个列表并将每个元素添加到其中?

neighbours = {}
myList = [('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
for i in myList:
    if i[0] not in neighbours:
        neighbours[i[0]]= list()
    neighbours[i[0]].append(i[1])

print(neighbours)

编辑:结果:

{'B': ['C'], 'A': ['B', 'C', 'D'], 'C': ['D']}

直截了当,EAFP方法:

adj = [('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
mat = {}
for (x, y) in adj:
    try:
        mat[x].append(y)
    except KeyError:
        mat[x] = [y]
    try:
        mat[y].append(x)
    except KeyError:
        mat[y] = [x]

>>> mat
{'A': ['B', 'C', 'D'], 'C': ['A', 'B', 'D'], 'B': ['A', 'C'], 'D': ['A', 'C']}

或者,如果您愿意,默认字典:

from collections import defaultdict
default = defaultdict(list)
for (x, y) in adj:
    default[x].append(y)
    default[y].append(x)

>>> default
defaultdict(<type 'list'>, {'A': ['B', 'C', 'D'], 'C': ['A', 'B', 'D'], 'B': ['A', 'C'], 'D': ['A', 'C']})

如果您对性能感兴趣,速度会提高 10-20%。 (参见 this repl.it comparison