首页 > 解决方案 > 索引值不在列表中

问题描述

我需要编写返回数组的 2 个索引号的代码。该函数有 2 个参数,一个是数组,另一个是整数。

我需要检查数组中的两个值是否加起来为整数,并且只使用数组中的数字一次。

这是我的代码:

def func(a,b):
    for i in a: 
        cnt = 0
        while cnt < len(a):
            if i + a[cnt] == b and i != a[cnt]:
                return list([i,a[cnt]])
            else:
                cnt += 1
print(func([3,7,2,10,20],27))

我的输出func([3, 7, 2, 10, 20], 27)[7, 20].

此代码显示循环可以找到加起来为整数的数字。

但是当我这样做时:

def func(a,b):
    for i in a: 
        cnt = 0
        while cnt < len(a):
            if i + a[cnt] == b and i != a[cnt]:
                return a.index(i,a[cnt])
            else:
                cnt += 1               
print(func([3,7,2,10,20],27))

我明白了Value error: 7 not in list,这显然是。

我在其他练习中也遇到过这个问题。

我是不是做错了什么,或者索引函数不应该像那样使用。

什么是返回索引号而无需为其编写另一个循环的有效方法?

标签: pythonpython-3.xloops

解决方案


您传递的第二个参数index实际上是列表中开始搜索元素的起始索引(如您在此处看到的)。如果你删除它,你会看到它返回你想要的第一个值(但不是第二个)。需要注意的是,该index方法只会返回第一次出现的值。

def func(a,b):
    for i in a: 
        cnt = 0
        while cnt < len(a):
            if i + a[cnt] == b and i != a[cnt]:
                return a.index(i)
            else:
                cnt += 1               
print(func([3,7,2,10,20],27))
>>> 1

发生这种情况是因为您作为起始索引 ( a[cnt]) 传递的值大于数字 ( 1) 的实际索引。

通过删除它,您可以搜索所有列表,并找到正确的值(记住 Python 使用零索引迭代器)。

但是由于您想返回一个包含两个值的列表,您需要明确声明您想要每个值的索引,例如:

def func(a,b):
    for i in a: 
        cnt = 0
        while cnt < len(a):
            if i + a[cnt] == b and i != a[cnt]:
                return [a.index(i), a.index(a[cnt])]
            else:
                cnt += 1
print(func([3,7,2,10,20],27))
>>> [1, 4]

您可以使用两个for循环获得相同的结果,但是,以一种更简洁的方式(也为变量赋予有意义的名称):

def find_indices_for_sum(array, sum_value):
    for i in array:
        for j in array:
            if i + j == sum_value and i != j:
                return [array.index(i), array.index(j)]
print(find_indices_for_sum([3,7,2,10,20],27))
>>> [1, 4]

如果您希望能够处理相等的数字,则可以完全更改比较策略,使用索引而不是值,因为前者在列表中是唯一的,而后者不是。enumerate在这里是一个不错的选择,因为它允许以干净的方式同时遍历索引和值。

def find_indices_for_sum(array, sum_value):
    for i, value_i in enumerate(array):
        for j, value_j in enumerate(array):
            if i != j and value_i + value_j == sum_value:
                return [i, j]
print(find_indices_for_sum([3,3],6))
>>> [0, 1]

推荐阅读