python - 索引值不在列表中
问题描述
我需要编写返回数组的 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
,这显然是。
我在其他练习中也遇到过这个问题。
我是不是做错了什么,或者索引函数不应该像那样使用。
什么是返回索引号而无需为其编写另一个循环的有效方法?
解决方案
您传递的第二个参数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]
推荐阅读
- sql - 保留重复记录并删除所有重复记录的有效方法是什么?
- reactjs - 如何在 Redux Action 中分离 firestore 监听器
- c# - Azure Function (C#) 中的位图透明像素到白色
- r - Dplyr,如果向量列表中存在任何值,则过滤组
- javascript - 使用 preventDefault 覆盖打开新标签
- python - 如何在没有 Pandas 的情况下迭代列表列表中的列并更改值
- vagrant - vagrant 2.2.7 - 不能 vagrant up:默认值:警告:身份验证失败。重试
- spring-boot - JSON 解析错误:无法构造 `org.test.dtos.TestChild` 的实例(尽管至少存在一个 Creator)
- c# - 了解 C# 中的资源/资源文件及其用途的问题
- mariadb - mariadb.service:无法设置挂载命名空间:权限被拒绝/在命名空间生成步骤中失败