我很难理解我要实现的一个算法。我有两个链表,我想从这两个链表中取特定的组合。
举个例子。
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)]
回答“给定两个列表,从每个列表中找到一个项对的所有可能排列”的问题,并使用基本的Python功能(即不使用itertools),从而使其易于复制到其他编程语言:
def rec(a, b, ll, size):
ret = []
for i,e in enumerate(a):
for j,f in enumerate(b):
l = [e+f]
new_l = rec(a[i+1:], b[:j]+b[j+1:], ll, size)
if not new_l:
ret.append(l)
for k in new_l:
l_k = l + k
ret.append(l_k)
if len(l_k) == size:
ll.append(l_k)
return ret
a = ['a','b','c']
b = ['1','2']
ll = []
rec(a,b,ll, min(len(a),len(b)))
print(ll)
返回
[['a1', 'b2'], ['a1', 'c2'], ['a2', 'b1'], ['a2', 'c1'], ['b1', 'c2'], ['b2', 'c1']]
对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)]
来自此链接的引用
更好的答案只适用于所提供的特定长度的列表。
这里有一个版本,适用于任何长度的输入。同时,从组合和排列的数学概念上明确了算法。
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