তালিকাগুলির তালিকার সমস্ত সংমিশ্রণ


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
@ এমজাল্ডে, কি এই সংমিশ্রণগুলি যুক্ত করা সম্ভব হবে: (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 এটি সম্পূর্ণরূপে পরিষ্কার না কি পেতে চান কিন্তু যদি তা না হয়, উদাহরণস্বরূপ, প্রতিটি tuple বিপরীত আপনি এএ মোড়কের ফাংশন যা লাগে ব্যবহার করতে পারেন aইনপুট হিসাবে, ওভার iterates itertools.product(*a)এবং yieldউভয় tuple দ্বারা উত্পাদিত গুলি itertoolsএবং একটি বিপরীত সংস্করণ ( যেমন একটি তালিকা তৈরি করুন, reverse()এটি আবার টুপলে রূপান্তর করুন)। সেরা একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
জোছিম ওয়াগনার

24

সর্বাধিক মার্জিত সমাধানটি পাইথন ২.6 এ ইটারটুলস.প্রডাক্ট ব্যবহার করা ।

যদি আপনি পাইথন ২.6 ব্যবহার না করে থাকেন তবে এটিরটোলস প্রোডাক্টের ডক্সগুলি পণ্যটিকে "ম্যানুয়াল" উপায়ে করার জন্য একটি সমতুল্য কার্যকারিতা দেখায়:

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
সেমিকোলনের কী অবস্থা? :)
পাওলো বার্গান্টিনো 18

3
অভ্যাস জোর। আমি ভালবাসি কীভাবে পাইথন আপনাকে একটি অর্ধ-কোলন রাখতে দেয়, কেবল আমাদের 'সি / জাভা প্রোগ্রামারদের সহায়তা করতে। তবে এটা পরিষ্কার; আপনি যখন মুদ্রণের মতো কিছু করেন "সত্যই কোনও বিবৃতি টার্মিনেটর নয়;"; যা সি বা জাভাতে পুরোপুরি আইনী (যদিও অর্থহীন) তবে পাইথনে নিষিদ্ধ।
ম্যাথু ফ্ল্যাশেন


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))

আউটপুট:

[('ব্র্যান্ডের এক্রোনাইম: সিবিআইকিউ', 'ব্র্যান্ড কান্ট্রি: ডিএক্সবি')),
('ব্র্যান্ডের এক্রোনিয়াম: সিবিআইকিউ', 'ব্র্যান্ড কান্ট্রি: বিএইচ')),
('ব্র্যান্ডের সংক্ষিপ্ত বিবরণ: কেএমইফিক', 'ব্র্যান্ড কান্ট্রি: ডিএক্সবি'),
( 'ব্র্যান্ডের সংক্ষিপ্ত বিবরণ: KMEFIC', 'ব্র্যান্ডের দেশ: বিএইচ')]


এই উত্তরটি গ্রহণ করা উচিত, যেহেতু এটি অন্তর্নির্মিত ফাংশনটি ব্যবহার করে কেবলমাত্র এটিই কোনও এবং ভিন্ন ভিন্ন ধরণের ক্ষেত্রেও কাজ করে works
pedjjj

এই উত্তরটি বহু বছর আগে সরবরাহ করা উত্তরটির চেয়ে আলাদা কীভাবে?
দাউদ লাস্কুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.