Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有'itertools.compositions'的子集和`_Python_Algorithm_Recursion - Fatal编程技术网

Python 带有'itertools.compositions'的子集和`

Python 带有'itertools.compositions'的子集和`,python,algorithm,recursion,Python,Algorithm,Recursion,我有一个python中的整数列表,比如: weight = [7, 5, 3, 2, 9, 1] 我应该如何使用itertools.combines来查找这些整数的所有可能的和子集。 因此,我得到(一个带有3个整数的期望输出示例-权重=[7,5,3]: sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ] 与这些重量相关联的是另一个名为luggages的数组,它是一个列表列表,其中包含行李名称及其相应的重量,格式如下: luggages

我有一个python中的整数列表,比如:

weight = [7, 5, 3, 2, 9, 1]
我应该如何使用itertools.combines来查找这些整数的所有可能的和子集。 因此,我得到(一个带有3个整数的期望输出示例-权重=[7,5,3]:

sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ]
与这些重量相关联的是另一个名为luggages的数组,它是一个列表列表,其中包含行李名称及其相应的重量,格式如下:

luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]
我以这种方式创建了一个名为weight的数组

weight = numpy.array([c[1] for c in luggages]) 
我可以这样做的行李名称需要。 我尝试以这种方式使用itertools.compositions(根据建议):

我的目标是:打印出我在旅行中可以携带的所有可能的行李名称子集,给定满足子集总和正好等于23 kg的条件的每个子集的所有组合的
max_weight=23
kg。 更简单地说,我必须打印一份带有行李名称的列表,如果行李的重量加起来等于
max_weight=23

请记住:行李在每个子集中只能选择一次,但它们可以出现在尽可能多的子集中。而且,每个子集中的物品数量是无关的:可以是1件行李、2件行李、3件行李……只要它们的总和正好等于23。

我们正在为旅行推销员工作,是吗?您可以使用每个人最喜欢的Python专长来完成这项工作关于清单理解:

weight = [7, 5, 3, 2, 9, 1]

cmb = []
for x in range(1, len(weight) + 1):
    cmb += itertools.combinations(weight, x)

#cmb now contains all combos, filter out ones over the limit

limit = 23

valid_combos = [i for i in cmb if sum(i) == limit]

print(valid_combos)

[c代表范围内的i(len(行李)+1)代表组合中的c(行李,i)]
为您提供了所有可能的行李子集的扁平列表。现在您可以使用for循环来迭代这些子集。在循环中,您有另一个循环来累加当前子集的权重。如果总权重匹配,您可以再次迭代当前子集并输出名称。您实际上不需要权重数组y、 @NiklasB我想我明白你的意思,这帮了大忙!我唯一的问题是所有的c for I…..for c.我想我真的不明白它们是如何工作的?有没有可能向我解释一下?或者我可以参考的文档?谢谢你这和两个嵌套的
for
循环一样,它们产生一个值
c
,然后添加到列表的后面。请参阅我对其他人的评论question@NiklasB.我现在理解了嵌套for循环,但最初的
c
基本上是在做什么/变成什么?
[…]
括号是真正需要的,它们有什么作用?抱歉,朋友,我为您提供了一个指向Python文档的链接,该文档解释了列表理解,它解释了一切。您也可以在线查找教程或Python入门资源。您要找的术语是“列表理解”。如果你想用编程语言编程,你可能至少需要学习编程语言的基础;)啊,是这样的:)我收回我的评论!我想我们的答案在某些方面几乎是相同的:)我稍微清理了代码并修复了一个bug,希望你不介意。OP还想打印姓名,而不是重量,但我们也不需要为他/她做所有的工作,一点也不!接得好:)@NiklasB。你能解释一下我的意思和行为吗?@user3245453:这不是我的答案,但这是一个问题。一个类似的构造也用于此答案中。基本上,他们试图将集合理解的数学符号引入编程语言,即集合
{2i|i∈ R、 i>3}
变为
[2*i表示R中的i,如果i>3]
weight = [7, 5, 3, 2, 9, 1]

cmb = []
for x in range(1, len(weight) + 1):
    cmb += itertools.combinations(weight, x)

#cmb now contains all combos, filter out ones over the limit

limit = 23

valid_combos = [i for i in cmb if sum(i) == limit]

print(valid_combos)