Python 创建给定列表的无向图

Python 创建给定列表的无向图,python,python-3.x,Python,Python 3.x,我有一份清单: entry=['A','B','C','null','B','A','D','null','E','F'] 相邻的字母(顶点)形成一条边null'是一个分隔符 每条边的权重为1。边(A,B)的权重为2,因为它出现两次 要可视化,上面的列表将是此图: 我想创建一个字典,类似于邻接列表 dict= { 'A':{'B':2,'D',1}, 'B':{'A':2,'C':1}, 'C':{'B':1}, 'D':{'A':1}, 'E':{'F':1}, 'F':{'E':1} }

我有一份清单:

entry=['A','B','C','null','B','A','D','null','E','F']
相邻的字母(顶点)形成一条边null'是一个分隔符

每条边的权重为1。边(A,B)的权重为2,因为它出现两次

要可视化,上面的列表将是此图:

我想创建一个字典,类似于邻接列表

dict= {
'A':{'B':2,'D',1},
'B':{'A':2,'C':1},
'C':{'B':1},
'D':{'A':1},
'E':{'F':1},
'F':{'E':1}
}
其中第一个关键点是顶点,第二个关键点是相邻的顶点及其权重值

如何得出上面的图表。如果有其他更好的方法来表示上述图形,我将非常感谢您的帮助。

一个解决方案是在reduce(不带累加器)一次查看两个相邻元素时,将
条目
列表添加到图形字典中:

from functools import reduce

graph = {}

def add_edge(u, v):
    if u != 'null' and v != 'null':
        if u in graph:
            graph[u][v] = graph[u].get(v, 0) + 1
        else:
            graph[u] = {v: 1}
        if v in graph:
            graph[v][u] = graph[v].get(u, 0) + 1
        else:
            graph[v] = {u: 1}
    return v

entry = ['A','B','C','null','B','A','D','null','E','F']
reduce(add_edge, entry)

print(graph)
# {'B': {'A': 2, 'C': 1}, 'E': {'F': 1}, 'F': {'E': 1}, 'C': {'B': 1}, 'A': {'B': 2, 'D': 1}, 'D': {'A': 1}}
编辑

一种“更纯粹”的缩减方法是将相邻元素压缩在一起,然后使用初始值设定项进行缩减:

def add_edge(graph, edges):
    u, v = edges
    if u != 'null' and v != 'null':
        # ... same thing as before
    return graph

entry = ['A','B','C','null','B','A','D','null','E','F']
graph = reduce(add_edge, zip(entry[:-1], entry[1:]), {})

借助@slider answer,您还可以使用
map
(内置,无需导入)来实现以下目的:

graph = {}
def add_edge(l):
    u, v = l[0], l[1]
    if u != 'null' and v != 'null':
        if u in graph:
            graph[u][v] = graph[u].get(v, 0) + 1
        else:
            graph[u] = {v: 1}
        if v in graph:
            graph[v][u] = graph[v].get(u, 0) + 1
        else:
            graph[v] = {u: 1}
    return v

list(map(add_edge, [entry[i:i+2] for i in range(len(entry) - 1)]))

>>> graph
{'A': {'B': 2, 'D': 1},
 'B': {'A': 2, 'C': 1},
 'C': {'B': 1},
 'D': {'A': 1},
 'E': {'F': 1},
 'F': {'E': 1}}

使用
list(map(func..)
的原因是,对于Python3,
map
返回一个生成器而不是执行,因此必须使用list强制它执行。我们对那条生产线的产量不感兴趣。如果您使用的是Python2,那么只需使用
map(func..)

如何显示您首先尝试的代码。简单地迭代组并在字典上的每个计数器上添加一个数字似乎很简单。@JBernardo,我只想像上面一样列出邻接列表,我将使用它进行进一步的计算。代码很复杂,我把它简化为上面的问题,这样就很容易理解了。这可能很琐碎,但我无法理解。哇,我甚至对reduce一无所知。让我研究一下。但这解决了我的问题。谢谢你能不能只更新脚本来处理单词,而不是字母?@EricKlaus我看不出这对单词有什么不同(因为它们也是字符串)。