我有一个列表:
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}
}
第一个关键点是一个顶点,第二个关键点是具有权重值的相邻顶点。
如何提出以上图表。如果上方图表还有其他更好的表示方式,我将不胜感激。
答案 0 :(得分:3)
一种解决方案是将reduce
的entry
列表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..)