सूचियों की एक सूची के सभी संयोजन


240

मैं मूल रूप से संयोजन के एक अजगर संस्करण की तलाश में हूंList<List<int>>

सूचियों की सूची को देखते हुए, मुझे एक नई सूची की आवश्यकता है जो सूचियों के बीच वस्तुओं के सभी संभावित संयोजन देती है।

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

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

जवाबों:


428

आपको चाहिए 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)]

20
क्या कोई इसमें तारांकन का अर्थ समझा सकता है *a?
सेरानो

52
*aइसका मतलब है कि ये तर्क कार्य या विधि से पारित किए जा रहे हैं। संदर्भ काdef fn(a,b,c): जवाब देना होगाfn(*[1,2,3])
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) आदि?
रेमन

1
@Reman यह पूरी तरह से स्पष्ट नहीं है कि आप क्या प्राप्त करना चाहते हैं, लेकिन अगर ऐसा है, उदाहरण के लिए, साथ ही प्रत्येक टपल के पीछे आप आ आवरण समारोह है कि लेता है का उपयोग कर सकते aइनपुट के रूप में, से अधिक iterates itertools.product(*a)और yieldदोनों टपल द्वारा उत्पादित है itertoolsऔर एक रिवर्स संस्करण ( उदाहरण के लिए, एक सूची बनाएं, reverse()इसे बदलें और वापस ट्यूपल में बदलें)। सबसे अच्छा एक नया सवाल पूछें।
जोकिम वैगनर

24

सबसे सुंदर समाधान अजगर 2.6 में itertools.product का उपयोग करना है।

यदि आप पायथन 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)

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

मुझे आशा है कि जब आप पहली बार इसका सामना करेंगे, तो आप मुझे उतना ही सुंदर पाएंगे।


5
उस अर्धविराम के साथ क्या हो रहा है? :)
पाओलो बेरगीनो

3
आदत में शुमार। मैं प्यार करता हूँ कि कैसे पायथन आपको एक सेमी-कॉलन लगाने देता है, बस हमें ol 'C / Java प्रोग्रामर की मदद करने के लिए। लेकिन यह स्पष्ट है; जब आप प्रिंट ("फू") जैसा कुछ करते हैं तो वास्तव में एक बयान टर्मिनेटर नहीं होता है ;; जो सी या जावा (यद्यपि व्यर्थ) में पूरी तरह से कानूनी है, लेकिन पायथन में प्रतिबंधित है।
मैथ्यू फ्लैशेन


5

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

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']

3

कोई इसके लिए बेस पायथन का उपयोग कर सकता है। कोड को सूचियों की सूची को समतल करने के लिए एक फ़ंक्शन की आवश्यकता होती है:

def flatten(B):    # function needed for code below;
    A = []
    for i in B:
        if type(i) == list: A.extend(i)
        else: A.append(i)
    return A

फिर एक चला सकते हैं:

L = [[1,2,3],[4,5,6],[7,8,9,10]]

outlist =[]; templist =[[]]
for sublist in L:
    outlist = templist; templist = [[]]
    for sitem in sublist:
        for oitem in outlist:
            newitem = [oitem]
            if newitem == [[]]: newitem = [sitem]
            else: newitem = [newitem[0], sitem]
            templist.append(flatten(newitem))

outlist = list(filter(lambda x: len(x)==len(L), templist))  # remove some partial lists that also creep in;
print(outlist)

आउटपुट:

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

-1
from itertools import product 
list_vals = [['Brand Acronym:CBIQ', 'Brand Acronym :KMEFIC'],['Brand Country:DXB','Brand Country:BH']]
list(product(*list_vals))

आउटपुट:

[('ब्रांड रेटिंग: CBIQ', 'ब्रांड देश: DXB'),
('ब्रांड रेटिंग: CBIQ', 'ब्रांड देश: BH'),
('ब्रांड रेटिंग: KMEFIC', 'ब्रांड देश: DXB'),
( 'ब्रांड ब्रांड: KMEFIC', 'ब्रांड देश: BH')]


इस उत्तर को स्वीकार किया जाना चाहिए, क्योंकि यह एक अंतर्निहित फ़ंक्शन का उपयोग करने वाला एकमात्र है, जबकि यह दर्शाता है कि यह किसी भी और विषम प्रकार के लिए भी काम करता है।
पद्मज

यह उत्तर कई वर्षों पहले प्रदान किए गए किसी भी सवाल से अलग कैसे है?
दाविद लासज़ुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.