假设您的实际缩进如下所示:
SpecialNum = 10
def number_move(move_number):
for elements in range(len(move_number)):
if ( SpecialNum != move_number[-1]):
x = move_number.index(SpecialNum)
y = move_number.index(SpecialNum)+1
move_number[y], move_number[x] = move_number[x], move_number[y]
return move_number
…问题是你10
在一个循环中一遍又一遍地向右交换,直到它到达最后。
如果那不是您想要的,那您为什么要首先拥有for elements in range(len(move_number))
?把它拿出来,它只会被交换一次。
作为旁注,您很少需要range(len(eggs))
; 你可以这样做for egg in eggs
(或者,如果你需要索引和实际对象,for index, egg in enumerate(eggs)
)。
此外,您还有很多不需要的额外括号,并使代码更难阅读。
同时,每次调用index
都必须搜索整个列表以找到对象的位置;如果您已经知道该位置,则最好使用它。它不仅更快、更简单,而且更健壮——如果列表中有两个元素具有相同的值,index
则只能找到第一个。在您的情况下,使用没有明显的方法index
,但至少您可以避免调用它两次。
把它放在一起:
SpecialNum = 10
def number_move(move_number):
x = move_number.index(SpecialNum)
y = x + 1
if y != len(move_number):
move_number[y], move_number[x] = move_number[x], move_number[y]
最后,我说没有明显的使用方法index
……但是有不明显的方法吗?当然。如果您要index
对同一个对象重复调用,我们可以将最后找到的索引作为函数接口的一部分,或者我们甚至可以在函数内部存储一个缓存。最简单的方法是将整个东西变成一个生成器。改变其参数的生成器可能有点令人困惑,所以让我们让它返回副本。最后,为了使其可定制,让我们使用一个参数,以便您可以指定一个不同于 10 的 SpecialNum。
SpecialNum = 10
def number_move(move_number, special_num=SpecialNum):
for x, element in reversed(list(enumerate(move_number))):
if element == special_num:
while x+1 < len(move_number):
move_number = (move_number[:x] +
[move_number[x+1], move_number[x]] +
move_number[x+2:])
yield move_number
x += 1
现在,它将把所有的 10s 移动到最后,一次一步。像这样:
>>> n = [1, 10, 2, 3, 10, 4, 5, 6]
>>> for x in number_move(n):
... print(x)
[1, 10, 2, 3, 4, 10, 5, 6]
[1, 10, 2, 3, 4, 5, 10, 6]
[1, 10, 2, 3, 4, 5, 6, 10]
[1, 2, 10, 3, 4, 5, 6, 10]
[1, 2, 3, 10, 4, 5, 6, 10]
[1, 2, 3, 4, 10, 5, 6, 10]
[1, 2, 3, 4, 5, 10, 6, 10]
[1, 2, 3, 4, 5, 6, 10, 10]
[1, 2, 3, 4, 5, 6, 10, 10]