交换列表中的元素时出现“ IndexError:列表索引超出范围”

时间:2019-10-25 13:24:38

标签: python list indexing index-error

我必须编写一个执行以下操作的函数“ swaplist”:

在输入2列表中给出:

列表1,列表2

例如:

[s4,s6]

[4,2,3,6,5]

*请紧记[s5]不能在输入中给出

返回一个列表,其中4与下一个数字交换,6与下一个数字交换

[2,4,3,5,6]

这是我写的代码:

def swaplist(list1,list2):
    list3=list2
    for i in list3:
        if ('s'+str(i)) in list1:
            a=list3.index(i)
            b=a+1
            list3[a],list3[b]=list3[b],list3[a]
    return list3

我尝试运行此代码,但出现以下错误:

IndexError: list index out of range

有人知道如何解决此问题吗?

谢谢你们的时间

  • 为我的英语不好而感到抱歉

3 个答案:

答案 0 :(得分:1)

您在迭代列表时正在修改列表,这将导致不必要的行为。

如果每次交换数字时都执行print(list3),则可以看到循环时列表发生了什么。

检查列表中的第一个数字后,我们看到它是一个4,应将其交换。列表为[4, 2, 3, 5, 6],现在为[2, 4, 3, 5, 6]

让我们移至列表中的第二个数字。由于您修改了原始列表,因此第二个数字现在是4,它将与下一个数字交换。

这是程序在每次交换后打印的内容:

[2, 4, 3, 5, 6]
[2, 3, 4, 5, 6]
[2, 3, 5, 4, 6]
[2, 3, 5, 6, 4]

您的四号将被移至列表中的下一个位置,之后将对其进行再次检查。

解决此问题的方法是构造一个新列表,而不修改原始列表。像这样:

def swaplist(list1,list2):
    # Make a copy of the original list so we don't modify it.
    # Use a more verbose name for the list so it's clear what the purpose is
    result_list=list2.copy()

    # Use enumerate to get both the index (i), as well as the list item in one go.
    for i, item in enumerate(list2):
        if ('s'+str(item)) in list1:
            # Swap the values using the original list as source.
            result_list[i],result_list[i+1]=list2[i+1],list2[i]
    return result_list

答案 1 :(得分:0)

这看起来像是一个作业问题。

问题在于您要更改的列表与要遍历的列表相同。解决方案的第一步是遍历list2并在list3中进行更改。这样,您第一次遇到4时,便将其向右交换。但是,然后您在list3中遇到的下一个项目再次是4,然后再次交换它。这种情况一直持续到您到达list3的末尾并出现错误,试图将4交换到末尾之外。

但是,另一个问题发生了:仅设置list3=list2并不能真正创建新列表。 list3和list2都指向同一列表。

为帮助查看发生了什么,您可以使用调试器逐步执行代码。由于这是一个很短的代码,因此您还可以添加print语句,以显示变量和列表的值。例如:

def swaplist(list1,list2):
    list3=list2
    for i in list3:
        print("i:", i)
        if ('s'+str(i)) in list1:
            a=list3.index(i)
            b=a+1
            list3[a],list3[b]=list3[b],list3[a]
            print('s' + str(i), a, b, "list is now:", list3)
    return list3

*剧透* 但是,要真正解决您的问题,您需要将list3作为一个全新的列表。对于真正复杂的结构,您需要一个深层副本,并且具有库函数来创建这样的deepcopy。对于一个简单的列表,可以通过再次遍历列表来创建副本。或者使用其他人提到的copy()函数。

def swaplist(list1,list2):
    list3=[i for i in list2]
    for i in list2: # note we are looping through list2 and changing list3
        print("i:", i)
        if ('s'+str(i)) in list1:
            a=list3.index(i)
            b=a+1
            list3[a],list3[b]=list3[b],list3[a]
            print('s' + str(i), a, b, "list is now:", list3)
    return list3

答案 2 :(得分:0)

正如JohanC提到的那样,问题是您更改了循环的列表。 您可以先复制list2,然后再更改list3。

def swaplist(list1,list2):
    list3=list2.copy()
    for i in list2:
        print(i)
        if f's{i}' in list1:
            a=list3.index(i)
            b=a+1
            list3[a],list3[b]=list3[b],list3[a]
    return list3