【问题标题】:Given a list of numbers find all the permutations that add to 100 of a certain length给定一个数字列表,找出加到 100 的特定长度的所有排列
【发布时间】:2021-03-13 11:35:54
【问题描述】:

给定一个数字列表,list = [0,1,2,10,21,25,30,33,34,35],我想在 python 上找到总和为 100 的这些数字的所有排列。

但是我希望能够多次使用列表中的值,并且我希望能够选择排列的长度。

例如,如果排列的长度是 3,我会返回:[[30, 35, 35], [33, 33, 34], [33, 34, 33], [34, 33, 33], [35, 30, 35], [35, 35, 30]]

我已经能够为长度 3 执行此操作。但是,我找到了总和为 100 的 3 个数字的所有组合,然后对其进行过滤以删除包含原始列表之外数字的解决方案。

问题是我不能按照这种方法处理长度为 4、5、6 的排列,因为有更多的组合。

谢谢

【问题讨论】:

  • 欢迎来到 StackOverflow。显示到目前为止您尝试过的内容(代码)。阅读:How to create a Minimal, Reproducible Example.
  • 您确定要更改顺序重复吗?你说过你有 6 个长度为 3 的答案,但实际上只是 2 个组合,数字顺序不同:1. 30 x1,35 x2:[30, 35, 35], [35, 30, 35], [35, 35, 30] 2。 33 x2、34 x1:[33, 33, 34], [33, 34, 33], [34, 33, 33]
  • @aneroid - 是的,我意识到我实际上只想要提供 2 个元素的外壳。但是anyrg给出的解决方案很好,因为它很容易摆脱重复的情况。 ty
  • 不要删除重复项——随着大小/长度的增加会有很多重复项——使用一开始就不会产生重复项的东西。使用@anyryg 的解决方案,但使用itertools.combinations_with_replacement 而不是itertools.product

标签: python list permutation


【解决方案1】:

我不确定我是否正确理解了您的问题,但试试这个:

from itertools import product

def special_permutation(lst, rno, suma):
  results = []
  for c in product(lst, repeat = rno):
      if sum(c) == suma:
        results.append(c)
  return results

【讨论】:

  • 请仔细阅读问题。这种蛮力方法正是 OP 说他不能使用的方法:“问题是我不能按照这种方法来处理长度为 4、5、6 的排列,因为有更多的组合。”
  • @ThierryLathuille 实际上,这个答案并没有错,因为它没有做 OP 所做的事情,即 “我找到了 3 个数字的所有组合,总和为 100,然后通过它过滤删除包含我原始列表之外的数字的解决方案。” 所以基本上,OP 可能找到了 list(range(100)) 的所有组合,这就是暴力破解不起作用的原因。当然有非蛮力选项,但是在蛮力类别中,OP的蛮力太蛮力了。这个答案只会暴力破解给定的列表,而且效果很好。
  • @ThierryLathuille - 这种方法有效。它不像我那样使用同样的暴力破解。我想它不那么粗暴,这就是它起作用的原因。基本上是无液说的。泰
  • 作为这个解决方案如何运作的一个例子:%timeit for 3: 180 µs ± 4.59 µs; 6:242 ms ± 4.24 ms,如果我循环 3、4、5 和 6:994 ms ± 32.2 ms。 OP 的可能的方法(未记录,并且我没有添加代码来过滤掉不正确的数字以获得正确的总和):%timeit for 3:174 ms ± 4.01 ms(OP 是 ~**1,000x** 慢); 6:不知道,我在 5 分钟后按了 Ctrl+C。毫无疑问,一个完全非暴力的解决方案会比这个更快,但是暴力不能用于此的断言是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多