시간이 지났고 내가 만들려고하는 알고리즘으로 머리를 감싸는 데 문제가 있습니다. 기본적으로 두 개의 목록이 있으며 두 목록의 모든 조합을 원합니다.
나는 그것을 올바르게 설명하지 않을 수 있으므로 여기에 예가 있습니다.
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만큼 성능이 좋지 않지만 파이썬을 사용하고 있으므로 성능은 이미 주요 관심사가 아닙니다 …
나는 다른 모든 답변도 좋아합니다!