我必须编写一个执行以下操作的函数“ 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
有人知道如何解决此问题吗?
谢谢你们的时间
答案 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