我不确定如何说出我的问题,所以我会在这里深入探讨。
我尝试做的是使用以下列表的输入在Python中执行图形着色问题:
[('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
这是为了表示"邻居"对于图C的每个边缘,使得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']}
非常感谢任何帮助!谢谢:))
答案 0 :(得分:2)
直截了当,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)
答案 1 :(得分:1)
>>> 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
答案 2 :(得分:1)
为什么不创建一个列表,并为其添加每个元素?
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']}