交换列表中的第一个和最后一个数字后列表索引出现问题

Issues with list index after swapping first and last number in the list

我是 Python 的新手,在交换练习中,我无法使用以下代码交换列表的第一个和最后一个元素(问题所在的行如下所示)。

def swapList(list):
     
    first = list.pop(0)  
    last = list.pop(-1)
     
    list.insert(0, last) 
    list.insert(-1, first)  # this line is the issue.
    # It does not swap first to the last position in the list,
    # but instead place it just before the last number. If I change
    # it to list.append(first) then the issue is solved.
    # I cannot understand why.
     
    return list

你能帮忙吗?

insert 方法会将元素插入到您提供的索引的左侧 - my_list.insert(0, 1) 会将值 1 插入到索引 0 的左侧 my_list.

要将项目添加到列表末尾,请改用 append 方法:my_list.append(1).

此外,不要调用列表 list - 列表是 Python 中的保留关键字,不应用于命名变量。您可以改为使用 my_list,或者最好是描述列表内容的名称 for/the 它包含的数据。

Python documentation 关于 list.insert 的说法:

list.insert(i, x) Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).

这就是列表发生的情况:

>>> xs = [1, 2, 3, 4, 5]
>>> first = xs.pop()
>>> 
>>> xs = [1, 2, 3, 4, 5]
>>> first = xs.pop(0)
>>> last = xs.pop(-1)
>>> 
>>> xs
[2, 3, 4]
>>> 
>>> xs.insert(0, first)
>>> xs
[1, 2, 3, 4]
>>> xs.insert(-1, last)
>>> xs
[1, 2, 3, 5, 4]
>>> 

您指定的索引是“要在其前插入的元素的索引”,因此 insert(-1, 5) 在最后一个元素之前插入 5。因此,如果您将行更改为 list.insert(len(list), last),您的函数将按预期工作


但是,有更好的方法来做到这一点。如果要交换列表中的第一项和最后一项,可以使用元组拆包:

xs[0], xs[-1] = xs[-1], xs[0]

list.pop 从列表中删除元素,使列表更短。你可以避免这种情况:

tmp = list[0]
list[0] = list[-1]
list[-1] = tmp

如果您需要使用 pop,则使用 insert to re-add 需要列表的索引:

tmp = list.pop(0)         # Remove 0 element from list, assign to tmp
list.insert(0, list[-1])  #Shifts elements by +1 for new 0th element
list[-1] = tmp            # Assign tmp to last element in list

试试这个

def swaplist(list):     
    
    first = list.pop(0)    
    last = list.pop(-1) 
      
    list.insert(0, last)   
    list.append(first)    
      
    return list

list = [10 , 20 , 30 , 40 , 50 , 60]
 
print(swaplist(list))