【问题标题】:Selected combinations between the values of two lists两个列表的值之间的选定组合
【发布时间】:2018-01-04 17:31:45
【问题描述】:

我有两个列表 ab。然后,我尝试查找列表值之间的所有三元素组合,并且仅查找列表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


【解决方案1】:

怎么样:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2014-06-20
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多