Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据第一个值和第二个值将列表分隔到字典中_Python_Dictionary_Graph Coloring - Fatal编程技术网

Python 如何根据第一个值和第二个值将列表分隔到字典中

Python 如何根据第一个值和第二个值将列表分隔到字典中,python,dictionary,graph-coloring,Python,Dictionary,Graph Coloring,我不知道该如何表达我的问题,所以我将在这里进行更深入的讨论 我尝试在Python中使用如下列表的输入来执行图形着色问题: [('A','B'),('A','C'),('A','D'),('B','C'),('C','D')] 这意味着表示图的每条边的“邻居”,例如A是B C&D的邻居,B是C的邻居,C是D的邻居 现在,我要做的是在字典中把这些键分解成这样的键: neighbors = {} neighbors['A'] = ['B', 'C', 'D'] neighbors['B'] = ['

我不知道该如何表达我的问题,所以我将在这里进行更深入的讨论

我尝试在Python中使用如下列表的输入来执行图形着色问题:

[('A','B'),('A','C'),('A','D'),('B','C'),('C','D')]
这意味着表示图的每条边的“邻居”,例如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']
{'A': ['B','C','D'], 'B': ['A','C'], 'C': ['A','B','D'], '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'}
但我想让它看起来像这样:

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

非常感谢您的帮助!谢谢:)

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

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']}

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

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']}
直截了当的方法:

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']}
或者,如果您愿意,可以使用默认的dict:

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']})
从集合导入defaultdict
default=defaultdict(列表)
对于调整中的(x,y):
默认值[x]。追加(y)
默认值[y]。追加(x)
>>>违约
defaultdict(,{'A':['B','C','D'],'C':['A','B','D'],'B':['A','C'],'D':['A','C']})
如果您对性能感兴趣,则速度会提高10-20%。(见)

直接进近:

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']}
或者,如果您愿意,可以使用默认的dict:

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']})
从集合导入defaultdict
default=defaultdict(列表)
对于调整中的(x,y):
默认值[x]。追加(y)
默认值[y]。追加(x)
>>>违约
defaultdict(,{'A':['B','C','D'],'C':['A','B','D'],'B':['A','C'],'D':['A','C']})

如果您对性能感兴趣,则速度会提高10-20%。(请参阅)

元组是否已排序?不,不必排序。它们只是用来判断哪些边彼此相邻。如果顺序无关紧要,那么使用
set
s而不是dict中的
list
s最简单。元组是否有序?不,它们不必如此。它们只是用来判断哪些边彼此相邻。如果顺序无关紧要,那么使用
set
s而不是dict中的
list
s是最简单的方法。这接近右边,但不会创建相互关系-OP的示例显示
'B':['a','C']
,尽管没有明确的
('B','a'))
元组,因为存在一个
('a','B')
元组。此外,我会使用
集合。defaultdict(list)
-或者更好的
defaultdict(set)
,因为顺序并不重要。这接近正确,但不会创建相互关系-OP的示例显示
'B':['A','C']
尽管没有明确的
('B','A')
元组,因为存在
('A','B')
tuple。另外,我会使用
collections.defaultdict(list)
-或者更好的
defaultdict(set)
,因为顺序并不重要。谢谢!我所寻找的绝对正确:)这并不是完全错误,但我很少看到EAFP应用于dict成员资格
defaultdict
是解决这个问题的惯用方法,或者在python版本上使用
setdefault
太早了,我添加了
defaultdict
@PeterGlopper,因为它在所有情况下都更快。我倾向于不导入defaultdict,除非我需要额外的速度,但是YMMV。谢谢!绝对正确的事情,我一直在寻找:)这并不完全是错误的,但我很少看到EAFP适用于dict会员
defaultdict
是解决这个问题的惯用方法,或者在python版本上使用
setdefault
太早了,我添加了
defaultdict
@PeterGlopper,因为它在所有情况下都更快。我倾向于不导入defaultdict,除非我需要额外的速度,但是YMMV。这对我来说是一个好的开始,但我真正想要的是让每个键显示它的邻居作为一个键,例如,
{'a':['B','C','D'],'B':['a','C','C':['a','B','D','D':['a','C']}
这对我来说是一个好的开始,但我真正想要的是让每个键都显示它的邻居作为一个键,例如,
{'a':['B','C','D'],'B':['a','C'],'C':['a','B','D'],'D':['a','C']}