如何根据一些额外的标准找到两个列表的所有独特组合?

时间:2016-08-26 02:46:17

标签: python

鉴于两个列表,我试图找到每个独特的组合,但是根据某些标准,主要是我需要至少3个元素,而list2不能单独出现。我确定如何解释它,所以我将使用较小的列表给出一个例子。

List1: [a,b,c,d]
List2: [A,B,C]

我想要恢复的是: L1 = [[a,b,c],[a,b,d],[a,c,d],[b,c,d],[a,b,c,d]]<<< list1中包含至少3个元素的所有独特组合。

L1 + ABC,这是来自List1的所有独特组合,来自List2的+ 1元素。

L1 + ABACBC,这是来自List1的所有独特组合,来自List2的+ 2个元素。

最后,L1 + List2

所以,我认为总共会有40种组合。

希望这说清楚。它在上下文中会更有意义,但这需要更多的解释,所以我试图简化它。

我认为答案应该只是for循环和if语句的切分选择,但也许有更优雅的解决方案。

编辑:[a,c,b]是一个错字。

2 个答案:

答案 0 :(得分:1)

如果我理解你正在尝试做什么,这应该有效:

import itertools

list1 = ['a', 'b', 'c', 'd']
list2 = ['A', 'B', 'C']

L1 = itertools.chain(*(itertools.combinations(list1, n) for n in range(3, len(list1)+1)))
L2 = itertools.chain(*(itertools.combinations(list2, n) for n in range(0, len(list2)+1)))

everything = [a+b for a, b in itertools.product(L1, L2)]

print(len(everything)) # 40
print('\n'.join(''.join(x) for x in everything))

# abc
# abcA
# abcB
# abcC
# abcAB
# abcAC
# abcBC
# abcABC
# abd
# abdA
# abdB
# abdC
# abdAB
# abdAC
# abdBC
# abdABC
# acd
# acdA
# acdB
# acdC
# acdAB
# acdAC
# acdBC
# acdABC
# bcd
# bcdA
# bcdB
# bcdC
# bcdAB
# bcdAC
# bcdBC
# bcdABC
# abcd
# abcdA
# abcdB
# abcdC
# abcdAB
# abcdAC
# abcdBC
# abcdABC

修改

如果您涉及到这类事情,请点击此处:

everything = [a+b for a,b in itertools.product(*(itertools.chain(*(itertools.combinations(l, n) for n in range(min, len(l)+1))) for l, min in [(['a', 'b', 'c', 'd'], 3), (['A', 'B', 'C'], 0)]))]

答案 1 :(得分:0)

from itertools import permutations
a = [1, 2, 3, 4]
print(list(permutations(a, 3)) + list(permutations(a, 4))

您的问题实际上是要求排列,这意味着元素不是唯一的,但排序是。在itertools.permutations处有一个用于排列的内置函数。我在上面的代码中所做的是获得3项排列,并将其添加到4项排列中,以显示至少3项的所有排列。