【发布时间】:2018-01-04 17:31:45
【问题描述】:
我有两个列表 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.combinations 的循环后面,在这样的系统中,无论条件。在大型列表的情况下,计算会严重超载。
是否有可能以不同的方式获得这样的结果?
【问题讨论】:
-
您不想要
b加上每个a的所有两个长度组合,以及a加上每个b的所有两个长度组合吗? -
为什么不呢,结果会和大列表上的时间活动一样有趣。
-
在这种情况下,
it.chain(it.product(it.combinations(a, 2), b), it.product(it.combinations(b, 2), a))这样的东西会给你一个((1, 2), 5), ((1, 2), 6), ...的迭代器,然后你可以将元组处理成列表。您还可以考虑是否真的需要一个列表中的所有输出。 -
我不一定需要它在一个列表中。对我来说更重要的是它在显式循环中工作,因为对于大型列表,它可能是一个重载系统。
-
因为稍后我会检查每个子列表的条件。
标签: python python-3.x combinations itertools