[python] 일련의리스트의 데카르트 곱을 얻으시겠습니까?

목록 그룹에서 Cartesian 제품 (가능한 모든 값 조합)을 얻으려면 어떻게해야합니까?

입력:

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]

원하는 출력 :

[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5) ...]



답변

itertools.product

Python 2.6에서 사용 가능합니다.

import itertools

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]
for element in itertools.product(*somelists):
    print(element)

어느 것과

for element in itertools.product([1, 2, 3], ['a', 'b'], [4, 5]):
    print(element)


답변

import itertools
>>> for i in itertools.product([1,2,3],['a','b'],[4,5]):
...         print i
...
(1, 'a', 4)
(1, 'a', 5)
(1, 'b', 4)
(1, 'b', 5)
(2, 'a', 4)
(2, 'a', 5)
(2, 'b', 4)
(2, 'b', 5)
(3, 'a', 4)
(3, 'a', 5)
(3, 'b', 4)
(3, 'b', 5)
>>>


답변

Python 2.5 이상인 경우 :

>>> [(a, b, c) for a in [1,2,3] for b in ['a','b'] for c in [4,5]]
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
 (2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
 (3, 'b', 4), (3, 'b', 5)]

다음은 재귀 버전입니다 product()(단지 예시).

def product(*args):
    if not args:
        return iter(((),)) # yield tuple()
    return (items + (item,)
            for items in product(*args[:-1]) for item in args[-1])

예:

>>> list(product([1,2,3], ['a','b'], [4,5]))
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
 (2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
 (3, 'b', 4), (3, 'b', 5)]
>>> list(product([1,2,3]))
[(1,), (2,), (3,)]
>>> list(product([]))
[]
>>> list(product())
[()]


답변

itertools.product :

import itertools
result = list(itertools.product(*somelists))


답변

나는 목록 이해력을 사용할 것입니다 :

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]

cart_prod = [(a,b,c) for a in somelists[0] for b in somelists[1] for c in somelists[2]]


답변

다음은 임시 목록을 저장하지 않는 재귀 생성기입니다.

def product(ar_list):
    if not ar_list:
        yield ()
    else:
        for a in ar_list[0]:
            for prod in product(ar_list[1:]):
                yield (a,)+prod

print list(product([[1,2],[3,4],[5,6]]))

산출:

[(1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6)]


답변

Python 2.6 이상에서는 ‘itertools.product`를 사용할 수 있습니다. 이전 버전의 Python에서는 최소한 시작점으로 문서에서 다음과 같은 (거의-설명서 참조) 동등한 코드를 사용할 수 있습니다 .

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)

둘 다의 결과는 반복자이므로 실제로 처리를 위해 목록이 필요한 경우을 사용하십시오 list(result).