问题是通过向右移动数字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/

10-09 20:21
查看更多