2009-04-28 25 views
137

मैं मूल रूप से Combination of List<List<int>>सूचियों की एक सूची के सभी संयोजनों

सूचियों की एक सूची को देखते हुए की एक अजगर संस्करण के लिए देख रहा हूँ, मैं एक नई सूची और सूचियों के बीच वस्तुओं के सभी संभव संयोजनों देता है की जरूरत है।

[[1,2,3],[4,5,6],[7,8,9,10]] -> [[1,4,7],[1,4,8],...,[3,6,10]] 

सूचियों की संख्या अज्ञात है, इसलिए मुझे कुछ मामलों की आवश्यकता है जो सभी मामलों के लिए काम करता है। लालित्य के लिए बोनस अंक!

उत्तर

266

आप itertools.product की जरूरत है:

>>> import itertools 
>>> a = [[1,2,3],[4,5,6],[7,8,9,10]] 
>>> list(itertools.product(*a)) 
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 4, 10), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 5, 10), (1, 6, 7), (1, 6, 8), (1, 6, 9), (1, 6, 10), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 4, 10), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 5, 10), (2, 6, 7), (2, 6, 8), (2, 6, 9), (2, 6, 10), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 4, 10), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 5, 10), (3, 6, 7), (3, 6, 8), (3, 6, 9), (3, 6, 10)] 
+10

सका कोई '* ए' में तारांकन के अर्थ की व्याख्या करता है? – Serrano

+23

'* ए' का अर्थ है कि ये फ़ंक्शन या विधि में दिए गए तर्क हैं। 'def fn (a, b, c):' 'fn (* [1,2,3]) '[संदर्भ] का जवाब देगा (http://www.saltycrane.com/blog/2008/01/how- उपयोग करने के लिए-args-and-kwargs-in-python /) – mjallday

+1

@mjallday, इन संयोजनों को भी जोड़ना संभव होगा: (7,4,1), (8,4,1), (9,4, 1), (10,4,1), (7,5,1), (8,5,1), (9,5,1), (10,5,1) आदि? – Reman

23

सबसे सुरुचिपूर्ण समाधान अजगर 2.6 में itertools.product उपयोग करने के लिए है।

def product(*args, **kwds): 
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy 
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 
    pools = map(tuple, args) * kwds.get('repeat', 1) 
    result = [[]] 
    for pool in pools: 
     result = [x+[y] for x in result for y in pool] 
    for prod in result: 
     yield tuple(prod) 
+0

मैं अब 2.6 का उपयोग कर रहा हूं, लेकिन जानकारी के लिए धन्यवाद! – Lin

14
listOLists = [[1,2,3],[4,5,6],[7,8,9,10]] 
for list in itertools.product(*listOLists): 
    print list; 

मैं आप के रूप में है कि उम्मीद है कि:

आप अजगर 2.6 का उपयोग नहीं कर रहे हैं, तो itertools.product के लिये दस्तावेज वास्तव में एक बराबर समारोह उत्पाद "मैन्युअल" तरीके से करना दिखाने जब मैंने पहली बार सामना किया तो मैंने सुरुचिपूर्ण किया।

+2

उस अर्धविराम के साथ क्या हो रहा है? :) –

+3

आदत की सेना। मुझे प्यार है कि पाइथन आपको ओल 'सी/जावा प्रोग्रामर की मदद करने के लिए सिर्फ एक अर्ध-कॉलन डाल देता है। लेकिन यह स्पष्ट है; वास्तव में एक कथन टर्मिनेटर नहीं है जब आप प्रिंट ("foo") की तरह कुछ करते हैं ;; जो सी या जावा में पूरी तरह से कानूनी है (यद्यपि व्यर्थ) लेकिन पाइथन में प्रतिबंधित है। –

2

Numpy यह कर सकते हैं:

>>> import numpy 
>>> a = [[1,2,3],[4,5,6],[7,8,9,10]] 
>>> [list(x) for x in numpy.array(numpy.meshgrid(*a)).T.reshape(-1,len(a))] 
[[ 1, 4, 7], [1, 5, 7], [1, 6, 7], ....] 
+0

क्या कोई इसे समझा सकता है? – ashishv

0

कुछ भी नहीं है इस कार्य के लिए सीधे ऊपर प्रत्यावर्तन के साथ गलत है, और आप एक संस्करण है कि तार के साथ काम करता जरूरत है, यह आपकी आवश्यकताओं को हो सकता है:

combinations = [] 

def combine(terms, accum): 
    last = (len(terms) == 1) 
    n = len(terms[0]) 
    for i in range(n): 
     item = accum + terms[0][i] 
     if last: 
      combinations.append(item) 
     else: 
      combine(terms[1:], item) 


>>> a = [['ab','cd','ef'],['12','34','56']] 
>>> combine(a, '') 
>>> print(combinations) 
['ab12', 'ab34', 'ab56', 'cd12', 'cd34', 'cd56', 'ef12', 'ef34', 'ef56'] 
संबंधित मुद्दे