Python 两个列表值之间的选定组合

Python 两个列表值之间的选定组合,python,python-3.x,combinations,itertools,Python,Python 3.x,Combinations,Itertools,我有两个列表a和b。然后,我尝试在列表的值之间查找所有三个元素组合,并且只查找那些其中包含列表b中的值的元素组合。目前,我采用以下方式: import itertools as it a = [1,2,3,4] b = [5,6] for i in range(len(b)): a.append(b[i]) c = [] for j in it.combinations(a, 3): if 5 in j or 6 in j: c.a

我有两个列表
a
b
。然后,我尝试在列表的值之间查找所有三个元素组合,并且只查找那些其中包含列表
b
中的值的元素组合。目前,我采用以下方式:

import itertools as it

a = [1,2,3,4]
b = [5,6]

for i in range(len(b)):
    a.append(b[i])

c = []              
for j in it.combinations(a, 3):
    if 5 in j or 6 in j:
       c.append(list(j))

# output:
# [[1, 2, 5], [1, 2, 6], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]
不幸的是,对于大型列表,这是一种无效的方法,因为列表
b
中元素的存在条件位于具有函数
it.compositions
的循环后面,在这样的系统中,该函数的执行完全与条件无关。在大列表的情况下,计算会严重过载

有可能以不同的方式获得这样的结果吗?

如何:

import itertools as it

a = [1,2,3,4]
b = [5,6]

c = []
for i in range(1,3):
    for j in it.combinations(b,i):
        for k in it.combinations(a,3-i):
           c.append(j+k)

难道你不想要所有两个长度组合的
b
加上每个
a
,以及所有两个长度组合的
a
加上每个
b
?为什么不呢,结果会是一样的:)与大型列表上的时间活动一样有趣。在这种情况下,类似于
it.chain(it.product(it.compositions(a,2),b),it.product(it.compositions(b,2,a))
将为您提供一个迭代器,
((1,2),5),((1,2),6),…
,然后您可以将元组处理为列表。您还可以考虑是否真的需要一个列表中的所有输出。我不一定需要一个列表中的所有输出。对我来说更重要的是,它在显式循环中工作,因为对于大型列表,它可能是一个重载系统。因为后来我检查每个子列表的条件。