5

我在 csv 文件中有配对值。成对的值都不一定是唯一的。我想将这个大列表拆分成独立的完整集以供进一步分析。

为了说明,我的“megalist”就像:

megalist = [['a', 'b'], ['a', 'd'], ['b', 'd'],['b', 'f'], ['r', 's'], ['t', 'r']...]

最重要的是,输出将保留配对值列表(即,不合并值)。理想情况下,输出最终会产生不同的 csv 文件,供以后单独分析。例如,这个超级巨星将是:

completeset1 = [['a', 'b'], ['a', 'd'], ['b', 'd'], ['b', 'f']]
completeset2 = [['r', 's'], ['t', 'r']]
...

在图论上下文中,我试图获取互斥子图的巨大图(其中配对值是连接的顶点)并将它们拆分为更易于管理的独立图。感谢您的任何意见!

编辑1:这让我处于一个可以前进的地方。再次感谢!

import sys, csv
import networkx as nx

megalist = csv.reader(open('megalistfile.csv'), delimiter = '\t')

G = nx.Graph()
G.add_edges_from(megalist)

subgraphs = nx.connected_components(G)

output_file = open('subgraphs.txt','w')

for subgraph in subgraphs:
     output_line = str(G.edges(subgraph)) + '\n'
     output_file.write(output_line)

output_file.close()
4

3 回答 3

6

您可以为此使用networkx。构造图:

>>> import networkx as nx
>>> megalist = [['a', 'b'], ['a', 'd'], ['b', 'd'],['b', 'f'], ['r', 's'], ['t', 'r']]
>>> G = nx.Graph()
>>> G.add_edges_from(megalist)

然后获取 subgrahs 列表:

>>> subgraphs = nx.connected_components(G)
>>> subgraphs
[['a', 'b', 'd', 'f'], ['s', 'r', 't']]
>>> [G.edges(subgraph) for subgraph in subgraphs]
[[('a', 'b'), ('a', 'd'), ('b', 'd'), ('b', 'f')], [('s', 'r'), ('r', 't')]]
于 2012-09-07T15:21:47.473 回答
0

非常简单的算法与计数器http://docs.python.org/library/collections.html#collections.Counter

from collections import Counter

megalist = [['a', 'b'], ['a', 'd'], ['b', 'd'],['b', 'f'], ['r', 's'], ['t', 'r']]

result = []
for l in megalist:
    cl = Counter(l)
    if not result:
        result.append([l])
    else:
        add = False
        for result_item in result:
            add = bool(filter(lambda e: bool(cl & Counter(e)) , result_item))

            if add and l not in result_item:
                result_item.append(l)
                break                    

        if not add:
            result.append([l])


print result

[[['a', 'b'], ['a', 'd'], ['b', 'd'], ['b', 'f']], [['r', 's'], ['t', 'r']]]
于 2012-09-07T16:04:24.957 回答
-2

您可以使用切片手动定义子列表:

completeset1=megalist[0:4]
completeset2=megalist[4:]

但是,听起来您确实想应用一些更深层次的逻辑,或使用额外的数据,以根据某些条件自动创建这些段。如果不了解您想要应用的逻辑,很难给出建议。

编辑:对问题的评论可能是很好的指示。

于 2012-09-07T15:21:26.973 回答