【问题标题】:Finding index of x numbers in list that add up to target (python)查找列表中 x 数字的索引,加起来为目标(python)
【发布时间】:2021-06-15 00:54:43
【问题描述】:

我正在尝试在列表中查找 x 数字的索引,这些索引加起来为特定目标。

当我在python中输入以下代码时,没有给出任何输出。

我在这里错过了什么?

提前非常感谢, 马特奥


import random
import math

def find(number):
    final = []
    trans = random.sample(values,number)
    summation = sum(trans)
    number_of_guesses = 0
    while number_of_guesses < math.factorial(len(values))/math.factorial(len(values)- 
    number):
        if summation == target:
            for i in range(len(values)):
                if trans[i] in values:
                    final.append(i)
                    return final
                else:
                    trans = random.sample(values,number)
                    find(number)
            number_of_guesses += 1

values = [100, 150, 140, 100, 120, 270, 500, -100, 120, 150, 160]
target = 390
find(2)

【问题讨论】:

  • 当您使用find(number) 递归时,您不会使用return。我怀疑你想要return find(number) - 但我质疑将递归和迭代结合起来。这种方法似乎似是而非。例如,如果summation 不是target,那么您将永远循环下去。
  • 感谢@ElliottFrisch。所以我只需要将'find(number)'调整为'return find(number)'?不过我理解你的意思——我的电脑正在努力寻找解决方案哈哈。我需要找到更好的方法。

标签: python list indexing


【解决方案1】:

以下是一种使用递归的方法,find_ind() 就是你想要的。

def find_val(num, target, values):
    if num == 1 or values == []:
        return [target] if target in values else []
    x, subvalues = values[0], values[1:]
    if subfound := find_val(num - 1, target - x, subvalues):
        return [x] + subfound
    else:
        return find_val(num, target, subvalues)

def find_ind(num, target, values, offset=0):
    if num == 1 or values == []:
        return [offset + values.index(target)] if target in values else []
    x, subvalues = values[0], values[1:]
    if subfound := find_ind(num - 1, target - x, subvalues, offset + 1):
        return [offset] + subfound
    else:
        return find_ind(num, target, subvalues, offset + 1)

values = [100, 150, 140, 100, 120, 270, 500, -100, 120, 150, 160]
target = 390

print(find_val(3, target, values)) # [100, 150, 140]
print(find_ind(3, target, values)) # [0, 1, 2]

print(find_val(11, 1710, values)) # [100, 150, 140, 100, 120, 270, 500, -100, 120, 150, 160]
print(find_ind(11, 1710, values)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我会解释find_val(),因为它更容易解释。给定一个值列表values,它首先选择第一个元素x。现在它询问自己(递归)是否可以从子列表values[1:] 中找到num - 1 数字,总和为target - x

如果这些数字存在,那么此递归将返回这些数字。否则,[] 将被返回。 (或者,你承诺自己实现这种回报。)

如果是前者,则意味着x 和那些返回的数字之和为target。所以返回[x] + "return from recursion"

如果是后者(即子列表不能生成target - x),那么x 找不到它的朋友来生成target。但是不要返回[];我们没有考虑除第一个以外的项目。所以现在递归使用相同的num 和相同的target,但使用子列表values[1:]。当没有第一项要调用x时,此递归将结束;即,当values == [].

find_ind() 遵循相同的参数,但带有一个额外的参数offset。这会跟踪给定列表在原始列表中的起始位置。

【讨论】:

  • 非常感谢@j1-lee 的全面反馈 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2021-08-23
  • 2021-02-27
  • 1970-01-01
  • 2010-09-15
  • 2014-10-13
相关资源
最近更新 更多