[python] 두 목록 사이의 조합?

시간이 지났고 내가 만들려고하는 알고리즘으로 머리를 감싸는 데 문제가 있습니다. 기본적으로 두 개의 목록이 있으며 두 목록의 모든 조합을 원합니다.

나는 그것을 올바르게 설명하지 않을 수 있으므로 여기에 예가 있습니다.

name = 'a', 'b'
number = 1, 2

이 경우 출력은 다음과 같습니다.

1.  A1 B2
2.  B1 A2

까다로운 부분은“number”변수의 항목보다“name”변수에 더 많은 항목이있을 수 있다는 것입니다 (number는 항상 name 변수와 같거나 작습니다).

나는 모든 조합 (루프에 중첩되어 있습니까?)을 수행하는 방법을 혼란스럽고 숫자 목록에있는 것보다 이름에 더 많은 항목이있는 경우 이름 변수의 항목을 이동하는 논리에 더 혼란 스럽습니다.

나는 최고의 프로그래머는 아니지만 누군가가 이것을 달성하기 위해 논리 / 알고리즘을 명확히하도록 도울 수 있다면 기회를 줄 수 있다고 생각합니다. 그래서 나는 방금 중첩 된 루프에 붙어 있습니다.

최신 정보:

다음은 3 개의 변수와 2 개의 숫자가있는 출력입니다.

name = 'a', 'b', 'c'
number = 1, 2

산출:

1.  A1 B2
2.  B1 A2
3.  A1 C2
4.  C1 A2
5.  B1 C2
6.  C1 B2



답변

참고 :이 답변은 위에 나온 특정 질문에 대한 것입니다. Google에서 왔으며 Python으로 Cartesian 제품을 얻는 방법을 찾고 itertools.product있거나 간단한 목록 이해가 원하는 것일 수 있습니다. 다른 답변을 참조하십시오.


가정 해 봅시다 len(list1) >= len(list2). 그럼 당신이 원하는에 표시하는 길이되는 모든 변경 걸릴 것입니다 len(list2)에서를 list1하고리스트 2에서 항목을 일치합니다. 파이썬에서 :

import itertools
list1=['a','b','c']
list2=[1,2]

[list(zip(x,list2)) for x in itertools.permutations(list1,len(list2))]

보고

[[('a', 1), ('b', 2)], [('a', 1), ('c', 2)], [('b', 1), ('a', 2)], [('b', 1), ('c', 2)], [('c', 1), ('a', 2)], [('c', 1), ('b', 2)]]


답변

가장 간단한 방법은 다음을 사용하는 것입니다 itertools.product.

a = ["foo", "melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]


답변

위의 가장 간단한 것보다 간단 할 수 있습니다.

>>> a = ["foo", "bar"]
>>> b = [1, 2, 3]
>>> [(x,y) for x in a for y in b]  # for a list
[('foo', 1), ('foo', 2), ('foo', 3), ('bar', 1), ('bar', 2), ('bar', 3)]
>>> ((x,y) for x in a for y in b)  # for a generator if you worry about memory or time complexity.
<generator object <genexpr> at 0x1048de850>

수입없이


답변

나는이 기능으로 제공되는 유일한 조합만으로 그 자체를 곱한 목록을 찾고있었습니다.

import itertools
itertools.combinations(list, n_times)

다음 은 Python 문서에서 itertools 발췌 한 내용 입니다. 원하는 내용을 찾는 데 도움이 될 수 있습니다.

Combinatoric generators:

Iterator                                 | Results
-----------------------------------------+----------------------------------------
product(p, q, ... [repeat=1])            | cartesian product, equivalent to a 
                                         |   nested for-loop
-----------------------------------------+----------------------------------------
permutations(p[, r])                     | r-length tuples, all possible 
                                         |   orderings, no repeated elements
-----------------------------------------+----------------------------------------
combinations(p, r)                       | r-length tuples, in sorted order, no 
                                         |   repeated elements
-----------------------------------------+----------------------------------------
combinations_with_replacement(p, r)      | r-length tuples, in sorted order, 
                                         | with repeated elements
-----------------------------------------+----------------------------------------
product('ABCD', repeat=2)                | AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2)                  | AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2)                  | AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2) | AA AB AC AD BB BC BD CC CD DD


답변

한 줄 목록 이해를 시도 할 수 있습니다.

>>> [name+number for name in 'ab' for number in '12']
['a1', 'a2', 'b1', 'b2']
>>> [name+number for name in 'abc' for number in '12']
['a1', 'a2', 'b1', 'b2', 'c1', 'c2']


답변

많은 수의 목록에 대한 모든 조합을 찾는 가장 좋은 방법은 다음과 같습니다.

import itertools
from pprint import pprint

inputdata = [
    ['a', 'b', 'c'],
    ['d'],
    ['e', 'f'],
]
result = list(itertools.product(*inputdata))
pprint(result)

결과는 다음과 같습니다.

[('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('c', 'd', 'e'),
 ('c', 'd', 'f')]


답변

또는 짧은 목록에 대한 KISS 답변 :

[(i, j) for i in list1 for j in list2]

itertools만큼 성능이 좋지 않지만 파이썬을 사용하고 있으므로 성능은 이미 주요 관심사가 아닙니다 …

나는 다른 모든 답변도 좋아합니다!