Skip to main content
 首页 » 编程设计

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

2025年05月04日14luoye11

假设我有两个列表;

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')] 

因此,这导致了 24 种可能的组合方式,因为 'A'、'B'、'C' 的顺序而'D'保持不变,4个字符可以赋值为4!方式,或者4! = 4×3×2×1 = 24。