Python 带有'itertools.compositions'的子集和`
我有一个python中的整数列表,比如: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
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)