使用嵌套for循环遍历单个列表时索引超出范围

2024-10-04 11:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个挑战,我正在尝试使用嵌套for循环来解决它。挑战要求在给定的整数数组nums和整数k中,确定数组中是否有两个不同的索引ij,其中nums[i] = nums[j]ij之间的绝对差小于或等于k

这是我的尝试:

def containsCloseNums(nums, k):

    for i in nums:
        for j in nums:
            if (nums[i] == nums[j]) and abs(i-k) <= k:
                return True
            else:
                return False

但这是我得到的错误:

Traceback (most recent call last):
  main.py3 in the pre-written template, in getUserOutputs
    userOutput = _rundyxlc(testInputs[i])
  main.py3 in the pre-written template, in _rundyxlc
    return containsCloseNums(*_fArgs_zeutcbsrcmec)
  main.py3 in the pre-written template, in containsCloseNums
    if (nums[i] == nums[j]) and abs(i-j) <= k:
IndexError: list index out of range

我看不出我超出索引的原因,因为我的增量没有超过列表的长度

我很感激所有的帮助,但由于这是一个挑战,我更愿意知道为什么我的逻辑不起作用,而不是仅仅给出一个答案


Tags: andtheinforreturnifmainpy3
3条回答

您应该将for循环更改为:

for i in range(len(nums)):
    for j in range(len(nums)):

您正在生成元素,而不是索引。在nums中有一个元素大于nums的长度,这就是抛出错误的原因

在代码中

for i in nums:

“i”是列表中的“nums”项

您应更改为:

for index_i, value_i in enumerate(nums):

那么“index_i”是项的索引,而value_i是列表“nums”中项的值

顺便说一下,我认为应该是:

def containsCloseNums(nums, k):

    for i_index, i_value in enumerate(nums):
        for j_index, j_value in enumerate(nums):
            if (i_value == j_value) and abs(i_index-j_index) <= k:
                return True
            else:
                return False

For循环遍历列表中的值,而不是索引

L = [1, 5, 4]
for i in L:
    print(i)

你会看到:

1
5
4

enumerate函数来获取索引。它为列表中的每个值形成(标记,值)元组:

for i, val in enumerate(L):
    print(i, val)

输出:

0, 1
1, 5
3, 4

此外,您的解决方案具有O(n^2)复杂性,这对于您的任务来说并不完美。想一想,如果你可以使用集合、dicts,或者也许可以利用排序来整理你的列表

相关问题 更多 >