Python 索引超出范围混乱

Python 索引超出范围混乱,python,indexing,range,logic,Python,Indexing,Range,Logic,所以我是编程新手,索引超出范围的错误让我有麻烦。快速示例: 我有一个列表,lst=(5,7,8,9,10) 我想删除每个偶数,以及偶数右边的每个数 我将通过获取每个偶数的索引,'I',并删除lst[I]和lst[I+1]来解决这个问题。当最后一个数字为偶数时,这将不起作用,因为列表中最后一个元素之后没有lst[i+1] 我在几个基本问题上遇到了这个问题。我解决这个问题的方法可能是错误的,因此我想知道: 我怎样才能以这种方式解决问题,无论它是否有效 解决这个问题最有效的方法是什么 您可以检查i+1

所以我是编程新手,索引超出范围的错误让我有麻烦。快速示例:

我有一个列表,
lst=(5,7,8,9,10)

我想删除每个偶数,以及偶数右边的每个数

我将通过获取每个偶数的索引,
'I'
,并删除
lst[I]
lst[I+1]
来解决这个问题。当最后一个数字为偶数时,这将不起作用,因为列表中最后一个元素之后没有
lst[i+1]

我在几个基本问题上遇到了这个问题。我解决这个问题的方法可能是错误的,因此我想知道:

  • 我怎样才能以这种方式解决问题,无论它是否有效
  • 解决这个问题最有效的方法是什么

  • 您可以检查
    i+1
    是否大于(编辑:或等于)列表长度,如果大于,则不执行代码

    您还可以在try/except块中处理此问题


    至于这种解决方法的效率,我觉得还不错。这种方法的一个缺点是,人们试图在修改列表时对列表进行迭代,这可能会导致未知错误。如果您正在使用
    remove()
    函数,您可能希望使用列表的副本执行此操作。

    您可以检查
    i+1
    是否大于(编辑:或等于)列表的长度,如果大于,则不执行代码

    您还可以在try/except块中处理此问题


    至于这种解决方法的效率,我觉得还不错。这种方法的一个缺点是,人们试图在修改列表时对列表进行迭代,这可能会导致未知错误。如果您使用的是
    remove()
    功能,您可能需要一份列表副本。

    欢迎来到俱乐部!编程是一件非常有趣的事情,你可以通过不断的进步来改进。我将尽量详尽地给出我的答案

    对于列表(也称为数组),请记住列表及其索引是基于零的。这意味着数组的索引从数字0开始(而不是像正常计数那样从数字1开始)

    在本例中,我不会像for或while那样使用你的站循环技术,因为你要移除元素,你要去阵列。如果在循环时删除该项,则会更改数组的长度

    相反,您可以通过循环创建一个新数组,并且只向该新数组添加或追加奇数值

    arr = [5, 7, 8, 9, 10]
    new_arr = []
    
    for idx, val in enumerate(arr):
        if idx % 2 == 1:
            new_arr.append(val)
    return new_arr # yields [7,9] or this process creates a new array of odd elements
    
    此外,请记住,在通过循环进行索引时使用
    [i+1]
    时,提前停止循环元素以避免索引范围外错误是有意义的

    执行此操作(无错误)

    而不是这个(索引外错误)。原因是,在最后一个元素上,如果尝试向最后一个索引添加1,然后访问不存在的值,则将返回错误:

    for idx in range(len(arr)):
        # pseudocode
        print(arr[i] + arr[i+1])
    
    下面有许多Pythonic(几乎像python特有的口语短语)方法可以更有效地实现您的目标

    可以使用切片、间距和del(删除状态)删除偶数个元素

    >>> arr = [5, 7, 8, 9, 10]
    >>> del arr[::2] # delete even numbers # if you wanted to delete odd numbers del arr[1::2]
    >>> arr
    [7, 9]
    
    或通过列表理解创建新列表,同时循环通过一些条件来过滤偶数:

    new_arr = [elem for idx, elem in enumerate(arr) if idx % 2 == 0]
    
    %运算符用于查看除法是否有余数。所以如果idx是10。那么10%2==0是真的,因为2可以分为10五次,剩余的是0。因此,该元素是均匀的。如果您正在检查奇数,则条件为:

    idx % 2 == 1
    

    您可以在这篇伟大的堆栈溢出文章中找到关于这些Python方法的进一步解释,欢迎来到俱乐部!编程是一件非常有趣的事情,你可以通过不断的进步来改进。我将尽量详尽地给出我的答案

    对于列表(也称为数组),请记住列表及其索引是基于零的。这意味着数组的索引从数字0开始(而不是像正常计数那样从数字1开始)

    在本例中,我不会像for或while那样使用你的站循环技术,因为你要移除元素,你要去阵列。如果在循环时删除该项,则会更改数组的长度

    相反,您可以通过循环创建一个新数组,并且只向该新数组添加或追加奇数值

    arr = [5, 7, 8, 9, 10]
    new_arr = []
    
    for idx, val in enumerate(arr):
        if idx % 2 == 1:
            new_arr.append(val)
    return new_arr # yields [7,9] or this process creates a new array of odd elements
    
    此外,请记住,在通过循环进行索引时使用
    [i+1]
    时,提前停止循环元素以避免索引范围外错误是有意义的

    执行此操作(无错误)

    而不是这个(索引外错误)。原因是,在最后一个元素上,如果尝试向最后一个索引添加1,然后访问不存在的值,则将返回错误:

    for idx in range(len(arr)):
        # pseudocode
        print(arr[i] + arr[i+1])
    
    下面有许多Pythonic(几乎像python特有的口语短语)方法可以更有效地实现您的目标

    可以使用切片、间距和del(删除状态)删除偶数个元素

    >>> arr = [5, 7, 8, 9, 10]
    >>> del arr[::2] # delete even numbers # if you wanted to delete odd numbers del arr[1::2]
    >>> arr
    [7, 9]
    
    或通过列表理解创建新列表,同时循环通过一些条件来过滤偶数:

    new_arr = [elem for idx, elem in enumerate(arr) if idx % 2 == 0]
    
    %运算符用于查看除法是否有余数。所以如果idx是10。那么10%2==0是真的,因为2可以分为10五次,剩余的是0。因此,该元素是均匀的。如果您正在检查奇数,则条件为:

    idx % 2 == 1
    

    您可以从这篇伟大的堆栈溢出文章中找到关于这些Python方法的进一步解释。您可能遇到的一个问题是,在删除过程中,列表索引会发生移动。解决这个问题的一种方法是按降序对要删除的索引进行排序,然后首先删除它们

    以下是一个示例,说明如何实现您所寻找的目标:

    myList=[5,7,8,9,10]
    #使用列表理解获取索引