问题是通过向右移动数字k次来旋转列表。例如k = 3的[1,2,3,4,5,6,7]将一次从右边的一个旋转数字并将它们移到列表的顶部,因此输出将是[5,6,7 ,1,2,3,4]。我决定不使用列表中的pop和insert操作,而是决定使用python中的dequeue数据类型,该数据类型支持在O(1)中添加到列表的左侧。但是,我不太确定如何从出队到列表进行转换。第二个功能有效,而第一个无效。如果您能解释原因,将不胜感激。
from collections import deque
def rotateNums(nums, k):
dq = deque(nums)
for _ in range(0,k):
num = dq.pop()
dq.appendleft(num)
nums = list(dq)
def rotateNums(nums, k):
dq = deque(nums)
for _ in range(0,k):
num = dq.pop()
dq.appendleft(num)
nums[:] = list(dq)
nums = [1,2,3,4,5,6,7]
k = 3
print(f'nums before rotation: {nums}')
rotateNums(nums, k)
print(f'nums after rotation: {nums}')
第一个函数的输出是:旋转后的数字:[1、2、3、4、5、6、7]
第二个函数的输出是:[5、6、7、1、2、3、4]
最佳答案
从双端队列到列表的对话中没有问题,在两种情况下都可以正确使用nums[:] = list(dq)
进行操作。它是第一个函数中的行nums = list(dq)
。这会将名称num
重新分配给函数中本地的其他列表对象。随后的替换操作将对本地对象(而不是您传入的列表)进行操作。
附带说明,您无需将dq
显式转换回列表即可进行分配。它已经是可迭代的,并且是一个序列,因此您可以做nums[:] = dq
很好。
关于python - 将python deque分配给列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60124134/