【发布时间】:2014-01-29 01:36:43
【问题描述】:
我在 python 中有一个整数列表,比如说:
weight = [7, 5, 3, 2, 9, 1]
我应该如何使用 itertools.combinations 来找到这些整数的所有可能的总和子集。 这样我就得到了(一个带有 3 个整数的期望输出示例 - weight = [7, 5, 3]:
sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ]
与这些重量相关,我有另一个名为“行李箱”的数组,它是一个包含行李名称及其对应重量的列表列表,格式如下:
luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]
我以这种方式创建了一个名为 weight 的数组。
weight = numpy.array([c[1] for c in luggages])
我可以为需要的行李名称执行此操作。 我尝试以这种方式使用 itertools.combinations(根据建议):
comb = [combinations(weight, i) for i in range(len(luggages))]
我的目标:在满足子集总和等于 23 KG 的条件的每个子集的所有组合的 max_weight = 23 kg 的情况下,打印出我可以在旅行中携带的所有可能的行李名称子集。
用更简单的术语来说,我必须打印出一个包含行李名称的列表,如果它的重量相加将等于max_weight = 23 完全正确。
请记住:行李只能在每个子集中选择一次,但它们可以出现在尽可能多的子集中。此外,每个子集中的项目数是无关紧要的:它可以是 1 件行李、2、3 件……只要它们的总和正好等于 23。
【问题讨论】:
-
[c for i in range(len(luggages)+1) for c in combinations(luggages, i)]为您提供所有可能的行李子集的扁平化列表。现在您可以使用 for 循环来遍历它们。在循环内部,您有另一个循环,它将当前子集的权重相加。如果总权重匹配,则再次遍历当前子集并输出名称。你真的不需要权重数组。 -
@NiklasB 我想我明白你的意思,这很有帮助!我唯一的问题是所有的 c for i ..... for c。我想我真的不明白它们是如何工作的?有什么办法可以向我解释吗?或者我可以参考的文档?谢谢
-
这与两个嵌套的
for循环相同,它们产生一个值c,然后将其添加到列表的后面。请参阅我对您的其他问题的评论 -
@NiklasB。我现在了解嵌套的 for 循环,但最初的
c本质上是在做什么/成为什么?[....]括号真的需要吗?它们有什么作用? -
对不起,朋友,我为您提供了解释列表推导的 Python 文档的链接,它解释了一切。您也可以只查找在线教程或介绍性 Python 资源。您正在寻找的术语是“列表理解”。如果您想使用编程语言进行编程,您可能至少需要学习编程语言的基础知识;)
标签: python algorithm recursion