[英]Split a tuple of tuples (or list of lists) of paired values into independent complete sets?
我在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()
你可以使用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')]]
非常简单的算法与计数器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']]]
您可以使用切片手动定义子列表:
completeset1=megalist[0:4]
completeset2=megalist[4:]
但是,听起来你真的想要应用更深层次的逻辑,或使用其他数据,根据某些条件自动创建这些段。 如果不了解您想要应用的逻辑,就很难提出建议。
编辑:问题的评论可能是好的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.