将python deque分配给列表

2024-09-19 23:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是通过将数字从右侧移动k次来旋转列表。e、 k=3的g.[1,2,3,4,5,6,7]将从右一次旋转数字,并将其移动到列表顶部,以便输出为[5,6,7,1,2,3,4]。我没有在列表中使用pop和insert操作,而是决定在python中使用支持在O(1)中添加到列表左侧的dequue数据类型。然而,我不太确定从出列到列表的转换是如何发生的。第二个函数起作用,而第一个函数不起作用。如果你能解释原因,我将不胜感激

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}')

第一个函数的输出是:旋转后的nums:[1,2,3,4,5,6,7]

第二个函数的输出是:[5,6,7,1,2,3,4]


Tags: 函数in列表fordefrange数字pop
2条回答

这是由于范围界定而发生的。在第一个函数中,使用以下代码nums = list(dq)deque的值赋值给nums。这告诉python这个nums是函数rotateNums的局部变量。因此,它在外部nums没有影响。相反,如果您这样做:

def rotateNums(nums, k):
  dq = deque(nums)
  for _ in range(0,k):
    num = dq.pop()
    dq.appendleft(num)
  nums = list(dq)
  nums[:] = list(dq)
  return nums
nums = [1,2,3,4,5,6,7]
k = 3
print(f'nums before rotation: {nums}')
nums = rotateNums(nums, k)
print(f'nums after rotation: {nums}')

输出将是:

nums before rotation: [1, 2, 3, 4, 5, 6, 7]
nums after rotation: [5, 6, 7, 1, 2, 3, 4]

而在第二种方法中,通过调用nums[:] =,您正在访问并修改nums的元素,这是允许的,并且不会创建局部变量nums

问题不在从deque到list的对话中,您在这两种情况下都正确地使用nums[:] = list(dq)。它与第一个函数中的nums = list(dq)行一起。这将在函数中本地将名称num重新分配给不同的列表对象。后续的替换操作对本地对象进行操作,而不是对传入的列表进行操作

另一方面,您不需要显式地将dq转换回列表来分配它。它已经是可编辑的,并且是一个序列,所以您可以很好地执行nums[:] = dq

相关问题 更多 >