我很难理解我要实现的一个算法。我有两个链表,我想从这两个链表中取特定的组合。
举个例子。
names = ['a', 'b']
numbers = [1, 2]
这种情况下的输出将是:
[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]
我可能有更多的名称比数字,即len(名称)>= len(数字)。下面是一个有3个名字和2个数字的例子:
names = ['a', 'b', 'c']
numbers = [1, 2]
输出:
[('a', 1), ('b', 2)]
[('b', 1), ('a', 2)]
[('a', 1), ('c', 2)]
[('c', 1), ('a', 2)]
[('b', 1), ('c', 2)]
[('c', 1), ('b', 2)]
更好的答案只适用于所提供的特定长度的列表。
这里有一个版本,适用于任何长度的输入。同时,从组合和排列的数学概念上明确了算法。
from itertools import combinations, permutations
list1 = ['1', '2']
list2 = ['A', 'B', 'C']
num_elements = min(len(list1), len(list2))
list1_combs = list(combinations(list1, num_elements))
list2_perms = list(permutations(list2, num_elements))
result = [
tuple(zip(perm, comb))
for comb in list1_combs
for perm in list2_perms
]
for idx, ((l11, l12), (l21, l22)) in enumerate(result):
print(f'{idx}: {l11}{l12} {l21}{l22}')
这个输出:
0: A1 B2
1: A1 C2
2: B1 A2
3: B1 C2
4: C1 A2
5: C1 B2
对interjay的答案进行了微小的改进,使结果作为一个平坦的列表。
>>> list3 = [zip(x,list2) for x in itertools.permutations(list1,len(list2))]
>>> import itertools
>>> chain = itertools.chain(*list3)
>>> list4 = list(chain)
[('a', 1), ('b', 2), ('a', 1), ('c', 2), ('b', 1), ('a', 2), ('b', 1), ('c', 2), ('c', 1), ('a', 2), ('c', 1), ('b', 2)]
来自此链接的引用
我正在寻找一个列表乘以自身只有唯一的组合,这是提供作为这个函数。
import itertools
itertools.combinations(list, n_times)
下面是itertools上Python文档的一个节选,它可能会帮助你找到你要找的东西。
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
注:此答案是针对上述特定问题的。如果你从谷歌来到这里,正在寻找一种在Python中获得笛卡尔积的方法,itertools。产品或一个简单的列表理解可能是你正在寻找的-见其他答案。
假设len(list1) >= len(list2)。然后,您似乎想要从list1中获取长度len(list2)的所有排列,并将它们与list2中的项匹配。在python中:
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)]]