繁体   English   中英

获取两个列表之间的每对值的成对组合

[英]Get every pair-wise combination of values between two lists

假设我有两个清单;

a = ['A', 'B', 'C', 'D']
b  = ['1', '2', '3', '4']

我知道我可以得到这两个列表的所有排列,如下所示:

for r in itertools.product(a, b): print (r[0] + r[1])

但是我要寻找的是存储在元组中的每个成对组合。 因此,例如,一些组合是:

[(A, 1), (B, 2), (C, 3), (D, 4)]
[(A, 1), (B, 3), (C, 2), (D, 4)]
[(A, 1), (B, 4), (C, 3), (D, 2)]
[(A, 1), (B, 3), (C, 4), (D, 2)]
[(A, 1), (B, 2), (C, 4), (D, 3)]

因此,它将遍历所有可能的组合,以使字母不具有相同的数字值。 我对有效的方法不知所措(特别是因为我需要在实际示例中将其缩放到三个列表)

我们可以对列表中的一个进行排列(例如此处的后一个),然后将每个排列与第一个列表一起压缩,例如:

from functools import partial
from itertools import permutations

def pairwise_comb(xs, ys):
    return map(partial(zip, xs), permutations(ys))

或如果所有子元素都应该是列表(此处仍然是可迭代对象,当您“实现”这些元素时可以采用特定形状):

from functools import partial
from itertools import permutations

def pairwise_comb(xs, ys):
    return map(list, map(partial(zip, xs), permutations(ys)))

对于给定的样本输入,我们获得:

>>> for el in pairwise_comb(a, b):
...     print(list(el))
... 
[('A', '1'), ('B', '2'), ('C', '3'), ('D', '4')]
[('A', '1'), ('B', '2'), ('C', '4'), ('D', '3')]
[('A', '1'), ('B', '3'), ('C', '2'), ('D', '4')]
[('A', '1'), ('B', '3'), ('C', '4'), ('D', '2')]
[('A', '1'), ('B', '4'), ('C', '2'), ('D', '3')]
[('A', '1'), ('B', '4'), ('C', '3'), ('D', '2')]
[('A', '2'), ('B', '1'), ('C', '3'), ('D', '4')]
[('A', '2'), ('B', '1'), ('C', '4'), ('D', '3')]
[('A', '2'), ('B', '3'), ('C', '1'), ('D', '4')]
[('A', '2'), ('B', '3'), ('C', '4'), ('D', '1')]
[('A', '2'), ('B', '4'), ('C', '1'), ('D', '3')]
[('A', '2'), ('B', '4'), ('C', '3'), ('D', '1')]
[('A', '3'), ('B', '1'), ('C', '2'), ('D', '4')]
[('A', '3'), ('B', '1'), ('C', '4'), ('D', '2')]
[('A', '3'), ('B', '2'), ('C', '1'), ('D', '4')]
[('A', '3'), ('B', '2'), ('C', '4'), ('D', '1')]
[('A', '3'), ('B', '4'), ('C', '1'), ('D', '2')]
[('A', '3'), ('B', '4'), ('C', '2'), ('D', '1')]
[('A', '4'), ('B', '1'), ('C', '2'), ('D', '3')]
[('A', '4'), ('B', '1'), ('C', '3'), ('D', '2')]
[('A', '4'), ('B', '2'), ('C', '1'), ('D', '3')]
[('A', '4'), ('B', '2'), ('C', '3'), ('D', '1')]
[('A', '4'), ('B', '3'), ('C', '1'), ('D', '2')]
[('A', '4'), ('B', '3'), ('C', '2'), ('D', '1')]

因此,由于'A''B''C''D'的顺序保持固定,并且可以在4个字符中分配4个字符,因此有24种可能的方式可以将其组合起来! 方式还是4! = 4×3×2×1 = 24

这可能比您想象的要容易得多。 关于什么:

import itertools

a = ['A', 'B', 'C', 'D']
b = ['1', '2', '3', '4']

for aperm in itertools.permutations(a):
    for bperm in itertools.permutations(b):
        print(list(zip(aperm, bperm)))

第一输出:

[('A', '1'), ('B', '2'), ('C', '3'), ('D', '4')]
[('A', '1'), ('B', '2'), ('C', '4'), ('D', '3')]
[('A', '1'), ('B', '3'), ('C', '2'), ('D', '4')]
[('A', '1'), ('B', '3'), ('C', '4'), ('D', '2')]
[('A', '1'), ('B', '4'), ('C', '2'), ('D', '3')]
[('A', '1'), ('B', '4'), ('C', '3'), ('D', '2')]
[('A', '2'), ('B', '1'), ('C', '3'), ('D', '4')]
[('A', '2'), ('B', '1'), ('C', '4'), ('D', '3')]
[('A', '2'), ('B', '3'), ('C', '1'), ('D', '4')]
...

(为这两个4元素列表打印了576行)

编辑:如果要将其推广到更多可迭代项,则可以执行以下操作:

import itertools

a = ['A', 'B', 'C', 'D']
b = ['1', '2', '3', '4']

gens = [itertools.permutations(lst) for lst in (a,b)]

for perms in itertools.product(*gens):
    print(list(zip(*perms)))

输出相同的东西,但可以轻松扩展,例如

import itertools

a = ['A', 'B', 'C', 'D']
b = ['1', '2', '3', '4']
c = ['W', 'X', 'Y', 'Z']

gens = [itertools.permutations(lst) for lst in (a,b,c)]   # add c

for perms in itertools.product(*gens):                    # no change
    print(list(zip(*perms)))                              # ''

您可以将带有yield递归用于无导入解决方案:

a = ['A', 'B', 'C', 'D']
b  = ['1', '2', '3', '4']
def combinations(d, current = []):
  if len(current) == 4:
    yield current
  elif filter(None, d):
    for i in d[0]:
      _d0, _d1 = [c for c in d[0] if c != i], [c for c in d[1] if c != d[1][0]]
      yield from combinations([_d0, _d1] , current+[[i, d[1][0]]])

for i in combinations([a, b]):
  print(i)

输出:

[['A', '1'], ['B', '2'], ['C', '3'], ['D', '4']]
[['A', '1'], ['B', '2'], ['D', '3'], ['C', '4']]
[['A', '1'], ['C', '2'], ['B', '3'], ['D', '4']]
[['A', '1'], ['C', '2'], ['D', '3'], ['B', '4']]
[['A', '1'], ['D', '2'], ['B', '3'], ['C', '4']]
[['A', '1'], ['D', '2'], ['C', '3'], ['B', '4']]
[['B', '1'], ['A', '2'], ['C', '3'], ['D', '4']]
[['B', '1'], ['A', '2'], ['D', '3'], ['C', '4']]
[['B', '1'], ['C', '2'], ['A', '3'], ['D', '4']]
[['B', '1'], ['C', '2'], ['D', '3'], ['A', '4']]
[['B', '1'], ['D', '2'], ['A', '3'], ['C', '4']]
[['B', '1'], ['D', '2'], ['C', '3'], ['A', '4']]
[['C', '1'], ['A', '2'], ['B', '3'], ['D', '4']]
[['C', '1'], ['A', '2'], ['D', '3'], ['B', '4']]
[['C', '1'], ['B', '2'], ['A', '3'], ['D', '4']]
[['C', '1'], ['B', '2'], ['D', '3'], ['A', '4']]
[['C', '1'], ['D', '2'], ['A', '3'], ['B', '4']]
[['C', '1'], ['D', '2'], ['B', '3'], ['A', '4']]
[['D', '1'], ['A', '2'], ['B', '3'], ['C', '4']]
[['D', '1'], ['A', '2'], ['C', '3'], ['B', '4']]
[['D', '1'], ['B', '2'], ['A', '3'], ['C', '4']]
[['D', '1'], ['B', '2'], ['C', '3'], ['A', '4']]
[['D', '1'], ['C', '2'], ['A', '3'], ['B', '4']]
[['D', '1'], ['C', '2'], ['B', '3'], ['A', '4']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM