我正在尝试编写一个代码来改变列表中整数的位置(基本上用另一个整数交换位置)
我试图使用所有逻辑,但仍然无法理解为什么我的代码搞乱了:
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)
输出应为:
[1,2,3,10,4,5,6]
>>>[1,2,3,4,10,5,6]
但输出如下:
[1,2,3,4,5,6,10]
答案 0 :(得分:3)
假设您的实际缩进看起来像这样:
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
现在,它会将10秒的所有移动到最后,一步一步。像这样:
>>> 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]
答案 1 :(得分:0)
您不需要for
循环:)
def number_move(move_number):
x = move_number.index(SpecialNum)
y = move_number.index(SpecialNum)+1
move_number[y], move_number[x] = move_number[x], move_number[y]
替代:
>>> def number_move(m, i):
num = m.pop(i)
m.insert(i+1, num)
return m
>>> l = number_move([1,2,3,10,4,5,6], 3)
>>> l
[1, 2, 3, 4, 10, 5, 6]