Py学习  »  Python

Python:查找两个列表x和y之间配对的所有组合,以便y中的所有元素都与x中的一个元素正好配对

askingquestions • 4 年前 • 1207 次点击  

min(x,y) ^ max(x,y)

x = ['a', 'b', 'c']
y = [1, 2, 3]

combos = get_combos(x,y)
for combo in combos:
    print(combo)

…我想写 get_combos(x, y) 这样它会返回一个包含27个组合对的列表,打印时,这些组合对如下所示:

[('a', 1) ('a', 2) ('a', 3)]
[('a', 1) ('a', 2) ('b', 3)]
[('a', 1) ('a', 2) ('c', 3)]
[('a', 1) ('b', 2) ('a', 3)]
[('a', 1) ('b', 2) ('b', 3)]
[('a', 1) ('b', 2) ('c', 3)]
[('a', 1) ('c', 2) ('a', 3)]
[('a', 1) ('c', 2) ('b', 3)]
[('a', 1) ('c', 2) ('c', 3)]
[('b', 1) ('a', 2) ('a', 3)]
[('b', 1) ('a', 2) ('b', 3)]
[('b', 1) ('a', 2) ('c', 3)]
[('b', 1) ('b', 2) ('a', 3)]
[('b', 1) ('b', 2) ('b', 3)]
[('b', 1) ('b', 2) ('c', 3)]
[('b', 1) ('c', 2) ('a', 3)]
[('b', 1) ('c', 2) ('b', 3)]
[('b', 1) ('c', 2) ('c', 3)]
[('c', 1) ('a', 2) ('a', 3)]
[('c', 1) ('a', 2) ('b', 3)]
[('c', 1) ('a', 2) ('c', 3)]
[('c', 1) ('b', 2) ('a', 3)]
[('c', 1) ('b', 2) ('b', 3)]
[('c', 1) ('b', 2) ('c', 3)]
[('c', 1) ('c', 2) ('a', 3)]
[('c', 1) ('c', 2) ('b', 3)]
[('c', 1) ('c', 2) ('c', 3)]

我已经看过itertools.combinations、itertools.product和itertools.permutations,但它们似乎都没有给我确切的我要找的东西。itertools.permutations与 zip this answer ),但是结果列表是互斥的,因为两个列表中的任何元素都不能在单个组合中重复(例如。 [('a', 1), ('a', 2), ('c', 3)]

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55308
 
1207 次点击  
文章 [ 4 ]  |  最新文章 4 年前
ychnh
Reply   •   1 楼
ychnh    4 年前

试试这个

import itertools
L = ['a','b','c']
P = list( itertools.product(L, repeat=3) )
[ [(x,1),(y,2),(z,3)] for x,y,z in P ]
Christian Sloper
Reply   •   2 楼
Christian Sloper    4 年前

这里是一个组合的_与_置换和排列,产生27。

a = set([])
for i in combinations_with_replacement(['a','b','c'],3):
    for j in permutations(i):
        a.add(j)

assert len(a) == 27

for i in a:
    print(list(zip(i,[1,2,3])))

[('b', 1), ('b', 2), ('b', 3)]
[('a', 1), ('a', 2), ('c', 3)]
[('b', 1), ('a', 2), ('b', 3)]
[('c', 1), ('a', 2), ('c', 3)]
[('c', 1), ('b', 2), ('a', 3)]
[('c', 1), ('c', 2), ('c', 3)]
[('a', 1), ('c', 2), ('a', 3)]
[('c', 1), ('b', 2), ('c', 3)]
[('c', 1), ('a', 2), ('a', 3)]
[('a', 1), ('a', 2), ('a', 3)]
[('a', 1), ('c', 2), ('b', 3)]
[('a', 1), ('c', 2), ('c', 3)]
[('c', 1), ('c', 2), ('a', 3)]
[('c', 1), ('b', 2), ('b', 3)]
[('a', 1), ('b', 2), ('a', 3)]
[('c', 1), ('c', 2), ('b', 3)]
[('a', 1), ('a', 2), ('b', 3)]
[('b', 1), ('c', 2), ('a', 3)]
[('b', 1), ('b', 2), ('c', 3)]
[('c', 1), ('a', 2), ('b', 3)]
[('b', 1), ('a', 2), ('c', 3)]
[('b', 1), ('c', 2), ('c', 3)]
[('b', 1), ('a', 2), ('a', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('b', 2), ('b', 3)]
[('b', 1), ('b', 2), ('a', 3)]
[('b', 1), ('c', 2), ('b', 3)]
Ajax1234
Reply   •   3 楼
Ajax1234    4 年前

不带导入的基本递归解决方案:

x = ['a', 'b', 'c']
y = [1, 2, 3]
def groups(d, c=[]):
  if len(c) == len(x):
    yield list(zip(c, y))
  else:
    for i in d:
       yield from groups(d, c+[i])

print(list(groups(x)))

输出:

[[('a', 1), ('a', 2), ('a', 3)], [('a', 1), ('a', 2), ('b', 3)], [('a', 1), ('a', 2), ('c', 3)], [('a', 1), ('b', 2), ('a', 3)], [('a', 1), ('b', 2), ('b', 3)], [('a', 1), ('b', 2), ('c', 3)], [('a', 1), ('c', 2), ('a', 3)], [('a', 1), ('c', 2), ('b', 3)], [('a', 1), ('c', 2), ('c', 3)], [('b', 1), ('a', 2), ('a', 3)], [('b', 1), ('a', 2), ('b', 3)], [('b', 1), ('a', 2), ('c', 3)], [('b', 1), ('b', 2), ('a', 3)], [('b', 1), ('b', 2), ('b', 3)], [('b', 1), ('b', 2), ('c', 3)], [('b', 1), ('c', 2), ('a', 3)], [('b', 1), ('c', 2), ('b', 3)], [('b', 1), ('c', 2), ('c', 3)], [('c', 1), ('a', 2), ('a', 3)], [('c', 1), ('a', 2), ('b', 3)], [('c', 1), ('a', 2), ('c', 3)], [('c', 1), ('b', 2), ('a', 3)], [('c', 1), ('b', 2), ('b', 3)], [('c', 1), ('b', 2), ('c', 3)], [('c', 1), ('c', 2), ('a', 3)], [('c', 1), ('c', 2), ('b', 3)], [('c', 1), ('c', 2), ('c', 3)]]
Daweo
Reply   •   4 楼
Daweo    4 年前

对我来说这是个任务 itertools.product zip ,我会:

import itertools
x = ['a', 'b', 'c']
y = [1, 2, 3]
for t in itertools.product(x,repeat=3):
    print(list(zip(t,y)))

输出:

[('a', 1), ('a', 2), ('a', 3)]
[('a', 1), ('a', 2), ('b', 3)]
[('a', 1), ('a', 2), ('c', 3)]
[('a', 1), ('b', 2), ('a', 3)]
[('a', 1), ('b', 2), ('b', 3)]
[('a', 1), ('b', 2), ('c', 3)]
[('a', 1), ('c', 2), ('a', 3)]
[('a', 1), ('c', 2), ('b', 3)]
[('a', 1), ('c', 2), ('c', 3)]
[('b', 1), ('a', 2), ('a', 3)]
[('b', 1), ('a', 2), ('b', 3)]
[('b', 1), ('a', 2), ('c', 3)]
[('b', 1), ('b', 2), ('a', 3)]
[('b', 1), ('b', 2), ('b', 3)]
[('b', 1), ('b', 2), ('c', 3)]
[('b', 1), ('c', 2), ('a', 3)]
[('b', 1), ('c', 2), ('b', 3)]
[('b', 1), ('c', 2), ('c', 3)]
[('c', 1), ('a', 2), ('a', 3)]
[('c', 1), ('a', 2), ('b', 3)]
[('c', 1), ('a', 2), ('c', 3)]
[('c', 1), ('b', 2), ('a', 3)]
[('c', 1), ('b', 2), ('b', 3)]
[('c', 1), ('b', 2), ('c', 3)]
[('c', 1), ('c', 2), ('a', 3)]
[('c', 1), ('c', 2), ('b', 3)]
[('c', 1), ('c', 2), ('c', 3)]

itertools.product