리스트리스트의 모든 조합


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있습니까?
Serrano

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) 등?
Reman

1
전적으로 당신이 얻을 싶은 명확하지 않다하지만이 경우, 예를 들어, 각 튜플의 반대는 당신이 필요 aa는 래퍼 함수 사용할 수 있습니다 @Reman a입력으로를 반복 처리 itertools.product(*a)yield에 의해 생성 된 튜플 모두이야 itertools및 역방향 버전 ( 예를 들어 목록을 작성하고 reverse()다시 튜플로 변환하십시오. 새로운 질문을하는 것이 가장 좋습니다.
Joachim Wagner

24

가장 우아한 해결책은 python 2.6에서 itertools.product 를 사용하는 것 입니다.

Python 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
세미콜론은 어떻게 되나요? :)
Paolo Bergantino

3
습관의 힘. 저는 C / Java 프로그래머를 돕기 위해 파이썬이 세미콜론 하나를 넣는 방법을 좋아합니다. 그러나 분명하다. print ( "foo");와 같은 것을 할 때 실제로는 문장 종결자가 아닙니다.; C 또는 Java에서 완벽하게 합법적이지만 (무의미하지만) Python에서는 금지되어 있습니다.
Matthew Flaschen

5

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], ....]

누군가 이것을 설명 할 수 있습니까?
ashishv

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


이 답변은 내장 함수를 사용하는 유일한 방법이므로 모든 유형과 이기종 유형에서도 작동한다는 점을 강조해야합니다.
pedjjj

이 답변은 몇 년 전에 제공된 것과 어떻게 다릅니 까?
Dawid Laszuk '12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.