为什么不起作用?
def func(lst):
for i in range(len(lst)):
lst[i] = lst[i - 1]
return lst
print(func([1, 2, 3, 4]))
预期输出:[4, 1, 2, 3]
实际输出:[4, 4, 4, 4]
为什么python在应为lst [1] = lst [0]时分配lst [1] = lst [-1]
答案 0 :(得分:1)
以下作品。 lst [i]已在for循环中重置。
def func(lst):
output = []
for i in range(len(lst)):
output.append(lst[i - 1])
return output
print(func([1, 2, 3, 4]))
答案 1 :(得分:0)
您在这里遇到逻辑错误,在第一次迭代时,您会像lst [0] = lst [-1]一样执行smth,然后将此值拉至所有剩余的indees。如果要向左移动数组,请尝试以下操作:
def shifter(lst):
return lst[-1:] + lst[:-1]
答案 2 :(得分:0)
列表是可变对象,您正在单个列表上进行迭代。在每次迭代中,变量lst
指向列表的当前状态,并且在循环内您正在修改该当前状态。
您期望的答案将要求Python在循环开始时复制并记住列表的初始状态,而Python不会这样做。
def func(lst):
initial = lst[:] # copy lst
for i in range(len(lst)):
lst[i] = initial[i - 1]
return lst
print(func([1, 2, 3, 4]))
答案 3 :(得分:0)
def func(lst):
for i in range(len(lst)):
print(i, lst[i-1])
lst[i] = lst[i - 1]
return lst
如果您查看代码的执行方式,则第一次迭代i将为0,而lst [i-1]将为lst [-1],它指向数组(4)中的最后一个元素。因此,在第一次迭代之后,您的数组如下所示: [4,2,3,4] 在第二个中,i = 1,而lst [i-1]将是lst [0],其值现在为4!因此,现在lst [1]将为4: [4,4,3,4] 等等.... 希望有帮助。
答案 4 :(得分:0)
您可以在第一个索引处插入最后一个项目,之后再删除最后一个项目:
def func(lst):
lst[:0] = lst[-1:]
del lst[-1:]
return lst
使func([1, 2, 3, 4])
返回:[4, 1, 2, 3]
答案 5 :(得分:0)
单步执行代码,一次:
最初,lst
是[1, 2, 3, 4]
,所以len(lst)
是4
。 range(n)
从0
到n - 1
返回值,因此循环将使用值0
,1
,2
和{{1 }}。
第一次循环迭代:
3
是i
0
=> lst[i] = lst[i - 1]
=> lst[0] = lst[0 - 1]
lst[0] = lst[-1]
现在为lst
第二循环迭代:
[4, 2, 3, 4]
是i
1
=> lst[i] = lst[i - 1]
=> lst[1] = lst[1 - 1]
lst[1] = lst[0]
现在为lst
第三循环迭代:
[4, 4, 3, 4]
是i
2
=> lst[i] = lst[i - 1]
=> lst[2] = lst[2 - 1]
lst[2] = lst[1]
现在为lst
第四循环迭代:
[4, 4, 4, 4]
是i
3
=> lst[i] = lst[i - 1]
=> lst[3] = lst[3 - 1]
lst[3] = lst[2]
现在为lst
答案 6 :(得分:0)
已建议交换。不要那样做:
def func(l):
for i in range(len(l) // 2):
l[i], l[-i - 1] = l[-i - 1], l[i]
return l
# func([1, 2, 3, 4]) -> [4, 3, 2, 1]
要把给定列表/数组的最后一个元素移动到第一个位置(如您所描述的那样,将其作为所需的输出),如果输入是链接列表,请使用blhsing's implementation。 Python列表是链接列表,因此blhsing的实现对此非常有效。如果您输入的是连续数组(例如Numpy数组),请使用以下命令:
def func(l):
l_last = l[len(l) - 1]
for i in range(len(l) - 1, 0, -1):
l[i] = l[i - 1]
l[0] = l_last
return l
我们的两个实现都对输入列表/数组进行了变异。
为什么函数输出[4, 4, 4, 4]
?
i_max = len(<list>) - 1
<list>[-i] = <list>[len(<list>) - i]
。
{for i in range(len(<list>))
,i_n
,0
,1
}中的...
=> i_max
i_n = 0
=> <list>[0] = <list>[i_max - 1]
。
如果为<list> = [1, 2, 3, 4]
,则为[1, 2, 3, 4][0] = [1, 2, 3, 4][3] = [4, 2, 3, 4]
。
在接下来的迭代中,将第i
个元素替换为第i-1
个元素,从而得到:
[4, 2, 3, 4]
=> [4, 4, 3, 4]
=> [4, 4, 4, 4]
=> [4, 4, 4, 4]
。