2015-10-14 2 views
5

की एक सूची के सभी संयोजनों तो मैं तारअजगर सूचियों

[['a','b'],['c','d'],['e','f']] 

की सूची की एक सूची है और मैं सभी संभव संयोजनों पाने के लिए, ऐसा है कि परिणाम

[['a','b'],['c','d'],['e','f'], 
['a','b','c','d'],['a','b','e','f'],['c','d','e','f'], 
['a','b','c','d','e','f']] 

अब तक है चाहता हूँ मैं इस कोड स्निपेट

input = [['a','b'],['c','d'],['e','f']] 
combs = [] 
for i in xrange(1, len(input)+1): 
    els = [x for x in itertools.combinations(input, i)] 
    combs.extend(els) 
print combs 

काफी हद तक this post में एक जवाब निम्नलिखित के साथ आए हैं।

लेकिन उस

[(['a','b'],),(['c','d'],),(['e','f'],), 
(['a','b'],['c','d']),(['a','b'],['e','f']),(['c','d'],['e','f']), 
(['a','b'],['c', 'd'],['e', 'f'])] 

में परिणाम है और मैं वर्तमान में, स्टम्प्ड हूँ उन tuples को अनपैक करने के एक सुरुचिपूर्ण, pythonic तरीका खोजने की कोशिश।

उत्तर

6

आप सूची में सूचियों के टुपल को फ़्लैट करने के लिए itertools.chain.from_iterable का उपयोग कर सकते हैं। उदाहरण -

import itertools 
input = [['a','b'],['c','d'],['e','f']] 
combs = [] 
for i in xrange(1, len(input)+1): 
    els = [list(itertools.chain.from_iterable(x)) for x in itertools.combinations(input, i)] 
    combs.extend(els) 

डेमो - इस तरह के एक लक्ष्य के लिए

>>> import itertools 
>>> input = [['a','b'],['c','d'],['e','f']] 
>>> combs = [] 
>>> for i in range(1, len(input)+1): 
...  els = [list(itertools.chain.from_iterable(x)) for x in itertools.combinations(input, i)] 
...  combs.extend(els) 
... 
>>> import pprint 
>>> pprint.pprint(combs) 
[['a', 'b'], 
['c', 'd'], 
['e', 'f'], 
['a', 'b', 'c', 'd'], 
['a', 'b', 'e', 'f'], 
['c', 'd', 'e', 'f'], 
['a', 'b', 'c', 'd', 'e', 'f']] 
+1

अच्छा। मैं अक्सर आश्चर्यचकित हूं कि 'itertools' कितना शक्तिशाली है। –

+0

बिल्कुल सही। ठीक वही जो मेरे द्वारा खोजा जा रहा था। धन्यवाद! –

0

एक विचार [0..2**n-1] जहां n एक बहुत ही सरल के अनुसार अपने सभी लक्ष्य तत्व को उप-सूचियों की संख्या है से पूर्णांकों मैप करने के लिए है नियम: (2**k)&i!=0 पर इंडेक्स के तत्व का प्रयोग करें जहां मैं [0..2**n-1] से अधिक चलाता हूं। दूसरे शब्दों में, i को थोड़ा सा पढ़ना है, और प्रत्येक बिट सेट के लिए, एल से संबंधित तत्व रखा गया है। गणितीय दृष्टिकोण से यह एक ऐसा सेट प्राप्त करने का सबसे साफ तरीका है जिसे आप करना चाहते हैं क्योंकि यह एक सेट के हिस्सों की परिभाषा को बहुत करीब से पालन करता है (जहां आपके पास 0 तत्वों के साथ सेट के लिए 2**n भाग हैं)।

की कोशिश की नहीं है, लेकिन ऐसा ही कुछ काम करना चाहिए:

l = [['a','b'],['c','d'],['e','f']]              
n = len(l) 
output = [] 
for i in range(2**n): 
    s = [] 
    for k in range(n): 
     if (2**k)&i: s = s + l[k] 
    output.append(s) 

आप खाली सूची नहीं करना चाहते हैं, बस प्रासंगिक लाइन के साथ बदल देते हैं:

for i in range(1,2**n): 
0

आप सभी संयोजनों चाहते हैं,

import itertools 

a = [['a','b'],['c','d'],['e','f']] 
a = a + [i + j for i in a for j in a if i != j] + [list(itertools.chain.from_iterable(a))] 
+0

यदि मूल सूची में 4 सूचियां हैं, तो इसमें लंबाई 3 के परिणामी संयोजन शामिल नहीं होंगे, हालांकि। –

+0

@ मैट एम। हाँ, आप सही हैं, मैंने नहीं माना कि सूची में 4 सूचियां हैं, केवल एक साधारण मामला दिखाएं। 3 से अधिक सूचियों के मामले में, आनंद एस कुमार की विधि आपको चाहिए। मुझे जानकारी देने के लिए धन्यवाद। –

0
समझ सूचियों के साथ

:

012 आप इस आसान तरीका विचार कर सकते हैं
combs=[sum(x,[]) for i in range(len(l)) for x in itertools.combinations(l,i+1)] 
संबंधित मुद्दे