2012-09-07 20 views
5

मैंने एक सीएसवी फ़ाइल में मूल्यों को जोड़ा है। युग्मित मूल्यों में से कोई भी जरूरी नहीं है। मैं इस बड़ी सूची को और विश्लेषण के लिए स्वतंत्र पूर्ण सेट में विभाजित करना चाहता हूं।युग्मित मूल्यों के tuples (या सूचियों की सूची) को स्वतंत्र पूर्ण सेट में विभाजित करें?

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

सबसे महत्वपूर्ण बात, उत्पादन बनती मूल्यों (अर्थात, मूल्यों को मजबूत नहीं) की सूची की रक्षा करेगा:

समझाने के लिए, मेरे "megalist" की तरह है। आदर्श रूप से, आउटपुट अंततः अलग-अलग विश्लेषण के लिए विभिन्न सीएसवी फाइलों के परिणामस्वरूप होगा। उदाहरण के लिए, इस megalist होगा:

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

एक ग्राफ सिद्धांत संदर्भ में, मैं स्वतंत्र रेखांकन में परस्पर अनन्य subgraphs का एक विशाल ग्राफ (जहां बनती मूल्यों कोने से जुड़े हुए हैं) लेने की कोशिश कर और उन्हें विभाजित कर रहा हूँ कि अधिक प्रबंधनीय हैं। किसी भी इनपुट के लिए धन्यवाद!

संपादित करें 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() 
+0

ध्वनि आप जोड़ी में दोनों तत्वों के खिलाफ एक BFS चाहते की तरह । –

+0

इसका उत्तर यहां दिया गया है: http://stackoverflow.com/a/1348995/1267329 –

उत्तर

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')]] 
+0

सुंदर, धन्यवाद! – user1644030

-2

आप मैन्युअल रूप से टुकड़ा करने की क्रिया का उपयोग कर अपने उप-सूचियों निर्धारित कर सकते हैं:

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

हालांकि, यह वास्तव में आप कुछ गहरे तर्क लागू होते हैं, या अतिरिक्त डेटा का उपयोग करें, इन क्षेत्रों के अनुसार स्वचालित रूप से बनाने के लिए करना चाहते हैं की तरह लगता है कुछ शर्त के लिए। आप किस तर्क को लागू करना चाहते हैं, इसके बारे में और जानने के बिना सलाह देना मुश्किल है।

संपादित करें: प्रश्नों की टिप्पणियां अच्छी पॉइंटर्स हो सकती हैं।

0

काउंटर के साथ बहुत ही सरल algo 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']]] 
संबंधित मुद्दे