给定列表创建无向图

时间:2018-11-04 23:02:10

标签: python python-3.x

我有一个列表:

entry=['A','B','C','null','B','A','D','null','E','F']

彼此相邻的字母(顶点)形成边缘。 “ null”是分隔符。

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

为直观起见,上面的列表将是以下图表: enter image description here

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

dict= {
'A':{'B':2,'D',1},
'B':{'A':2,'C':1},
'C':{'B':1},
'D':{'A':1},
'E':{'F':1},
'F':{'E':1}
}

第一个关键点是一个顶点,第二个关键点是具有权重值的相邻顶点。

如何提出以上图表。如果上方图表还有其他更好的表示方式,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

一种解决方案是将reduceentry列表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}} 到图字典,因为reduce(没有累加器)一次查看两个相邻元素:

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:]), {})

修改

减少的“纯净”方法是将相邻元素压缩在一起,然后使用初始化程序进行减少:

$cur_date=Carbon::now();


 $data=DB::table('mailbox_log as ml')
->leftjoin('registration as r','ml.reg_id','=','r.id')
->leftjoin('company as cmp','r.sociale_id','=','cmp.id')
->select('ml.*','r.id','r.g_id','r.num','cmp.name')
->whereRaw("DATEDIFF('" . Carbon::now() . "',created_at)  > 30")
->whereRaw("DATEDIFF('" . Carbon::now() . "',created_at)  < 60")
->get()->toArray();

答案 1 :(得分:1)

小猪支持@slider答案,您也可以为此使用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..))的原因是因为对于python 3,map返回一个生成器而不是执行,因此必须使用list来强制它执行。该行的输出对我们来说并不重要。如果您使用的是python 2,则只需使用map(func..)