我想在python中的列表中旋转k元素。例如,n = 7,k = 3,阵列[1,2,3,4,5,6,7]旋转到[5,6,7,1,2,3,4]。
这是我写的声明。它似乎在命令行中工作。
nums = nums[k%len(nums):] + nums[:k%len(nums)]
但是当我将它封装在像:
这样的函数中时def rotate(nums, k):
nums = nums[k%len(nums):] + nums[:k%len(nums)]
return
我想直接修改nums,但此功能不起作用。
我知道我可以使用for循环:
for i in range(k):
nums.insert(0,nums.pop())
但我想知道为什么以前的方法不起作用?
答案 0 :(得分:2)
你想要的是切片分配:
nums[:] = nums[k%len(nums):] + nums[:k%len(nums)]
这会改变传入的列表,因此在函数返回后可以看到更改。仅分配给nums
只会使nums
指向函数内的不同列表;它不会影响原始列表。
答案 1 :(得分:1)
您确定要修改nums吗?即使您不修改nums,也无需创建单独的列表。以下方法的一个优点是它可以用于任何序列。
nums = [x + 1 for x in range(7)]
nums[:] = rotate(nums,-10)
如果你坚持按照你的意思修改nums,你仍然可以这样做。如,
OpCodes.Ret
答案 2 :(得分:0)
函数内的nums
仅在该函数内。所以你需要从那个函数返回它。一种方法是这样的(python 2.7代码,如果使用3.x,则将括号添加到print
):
nums = [1, 2, 3, 4, 5, 6, 7]
k = 3
def rotate(nums, k):
return nums[k%len(nums):] + nums[:k%len(nums)]
print 'Original', nums
nums = rotate(nums, k)
print 'Rotated', nums