将Python列表转换为networkx图

6

目前我有一个列表:

[['Мама мыть', 10, 'рама'],
 ['Мама мыть', 10, 'рама', 5, 'долго'],
 ['Мама мыть', 10, 'рама', 3, 'вчера'],
 ['Мама мыть', 10, 'рама', 3, 'вчера', 1, 'поздно']]

我需要将其转换为Networkx边,其中单词对应该成为图的节点,整数之间成为权重:

G = nx.Graph()
G.add_edge('Мама мыть', 'рама', weight=10)
G.add_edge('рама', 'долго', weight=5)
G.add_edge('рама', 'вчера', weight=3)
G.add_edge('вчера', 'поздно', weight=1)

目前我卡住了,没有任何想法。如果有任何帮助,将不胜感激!


列表中似乎有很多重复的信息(例如,“Мама мыть”到“рама”的权重为10,在列表中出现了4次)。您确定所有出现的信息都是一致的吗? - Julien Marrec
@JulienMarrec 我看着最后一项,觉得它几乎像是节点和权重的扁平化版本...但是...思考如果第一个权重是12,然后在最后一个条目中发生了变化... - Jon Clements
@ninesalt 感谢您的回复。每个唯一的配对应该成为一个节点。元素只是文本字符串,用于某些自然语言处理工作。 - Alex Nikitin
@Alex 这是意图表示它是一个多重图吗? - Jon Clements
@JulienMarrec 感谢您的回复。我只需要唯一的配对,就像所需的输出中所示。 - Alex Nikitin
显示剩余3条评论
1个回答

3

由于您有重复的信息,我建议首先创建一个字典来确保唯一性。我添加了一个检查,以确保您没有冲突的距离对于重复的元素。

In [1]:
distances = {}
for row in l:
    for i in range(0, len(row)-1, 2):
        key_tuple = (row[i], row[i+2])
        d = row[i+1]
        if key_tuple in distances.keys():
            if distances[key_tuple] != d:
                print("Warning: Found a conflicting distance for {}: {} and "
                      "{}. Using last".format(key_tuple, distances[key_tuple], d))
        distances[key_tuple] = d

In [2]: distances
Out[2]:
 {('Мама мыть', 'рама'): 10,
 ('рама', 'долго'): 5,
 ('рама', 'вчера'): 3,
 ('вчера', 'поздно'): 1}

然后,您可以使用该字典创建边缘。
In [3]:
import networkx as nx
G = nx.Graph()
for k, v in distances.items():
    G.add_edge(k[0], k[1], weight=v)

当然,if (distances.get(key_tuple) is not None) and (distances.get(key_tuple) != d): 也可以。在我看来这只是一种美学上的处理。 - Julien Marrec
1
非常感谢!这正是我想要的。 - Alex Nikitin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接