【问题标题】:Generate only certain combinations from a list in Python仅从 Python 中的列表生成某些组合
【发布时间】:2014-05-14 21:26:29
【问题描述】:

我已使用以下脚本生成所有组合:

import itertools
x = 7
my_list = range(1, 11)
for k in [x]:
   for sublist in itertools.combinations(my_list, k):
      print sublist

对于第二部分,我将从 range(1, 11) 中随机抽取 6 个元素。我们称它们为 my_second_list。 我需要生成最少数量的 my_list 组合,以便获得至少一个组合以包含来自 my_second_list 的 5 个元素。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 你能通过检查sublist来过滤输出吗?
  • 我认为您需要编辑您的问题并包含您的预期输出。
  • 我已将问题编辑得更明确。以前的版本没有意义。昨晚写的时候一定很累吧:)

标签: python list combinations itertools


【解决方案1】:
import itertools

x = 7
my_list = range(1,11)

for k in [x]: # isn't this just 7?
    your_output = (combination for combination in itertools.combinations(my_list,k) if all(element in combination for element in [1,2,3,4,5]))

这很丑陋,但我就是这样做的(如果我正确理解你的问题。你试图只获得那些包含某个项目子集的组合,对吧?如果你想要所有组合在包含项目子集的第一个组合之前并包括在内,我会这样做:

accumulator = list()
subset = [1,2,3,4,5] # or whatever
for k in [x]:
    for combination in itertools.combinations(my_list,k):
        accumulator.append(combination)
        if all(el in combination for el in subset):
            break

根据您的具体用例,您可能需要考虑将subset 定义为set(例如{1,2,3,4,5})并执行subset.issubset(set(combination)),但如果不进行一些分析,很难判断这是否更好。

【讨论】:

  • @wiseguy0106 还不是很清楚。您是否只需要第一个组合,使某些N 元素与另一个列表L 共享? L 有多少个元素? N可以改吗?
  • 更清楚地说:我有 2 个列表:A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 和 B = 来自列表 A 的 6 个随机元素. 我需要生成列表 A 的最小组合 7 以获得至少一个组合以包含列表 B 中的 5 个元素。它类似于简化的乐透系统:您以某些组合玩 10 个数字,如果您做对了,让我们说 5 个中奖号码,您保证至少有 1 个包含 4 个中奖号码的组合。而且你不需要玩所有可能的组合。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 2013-08-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多