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

时间:2020-06-19 06:15:56

标签: python

我正在解决一个挑战,我正在尝试使用嵌套的for循环来解决它。质询询问给定的整数#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(void) { setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); float a, b, sm; int i = 2; printf("First number: \n"); scanf("%f", &a); printf("Second number: \n"); scanf("%f", &b); printf ("%.2f + %.2f = %.2f -> Summe \n", a, b, sm = a+b); printf ("%.2f / %d = %.2f -> Mittelwert \n", sm, i, sm/i); printf ("%.2f - %.2f = %.2f -> Differenz \n", a, b, a-b); printf ("%.2f * %.2f = %.2f -> Produkt \n", a, b, a*b); printf ("%.2f / %.2f = %.2f -> Division\n", a, b, a/b); } 和整数nums的数组,确定数组k中是否存在两个不同的索引ij并且nums[i] = nums[j]i之间的绝对差小于或等于j

这是我的尝试

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

我看不到为什么我没有索引的原因,因为我没有超出列表的长度。

我很感谢所有帮助,但是由于这是一个挑战,所以知道为什么我的逻辑不起作用而不是吐出一个答案对我来说更有益。

5 个答案:

答案 0 :(得分:1)

在您的代码中

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

答案 1 :(得分:0)

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)复杂度,对于您的任务而言并不完美。考虑一下您是否喜欢使用集合,字典,或者可以使用一些对列表进行排序的方法。

答案 2 :(得分:0)

您应将for循环更改为:

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

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

答案 3 :(得分:0)

您的代码中的问题是,当您这样做

for i in nums

inums中的项目,而不是index

为了进行比较,您只需做

if i == j

但是您还必须使用索引才能与k进行比较

for key, value in enumerate(nums):

其中key将是index,而value将是对应的item

答案 4 :(得分:0)

现在,此代码nums[i]nums[j]将尝试访问列表中的ith和jth元素。这是导致错误的原因。如果nums = [10, 20]nums[10]nums[20]不存在。

您要做的是访问列表中每个元素的索引,并在for循环中使用它。要访问索引,您可以使用enumerate

我还编辑了您的代码,以便现在可以使用。

def containsCloseNums(nums, k):
    for idxi, i in enumerate(nums):
        for idxj, j in enumerate(nums):
            if (nums[idxi] == nums[idxj]) and abs(i-k) <= k:
                return True
            else:
                return False