Присвоение python деку списку - PullRequest
1 голос
/ 08 февраля 2020

Проблема состоит в том, чтобы вращать список, перемещая числа справа, k раз. например, [1,2,3,4,5,6,7] с k = 3 будет вращать числа справа по одному и перемещать их в верхнюю часть списка, чтобы вывод был [5,6, 7,1,2,3,4]. Вместо того, чтобы использовать операцию выталкивания и вставки в список, я решил использовать тип данных dequue в python, который поддерживает добавление слева от списка в 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]

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Проблема не в диалоге из очереди в список, что вы правильно делаете с nums[:] = list(dq) в обоих случаях. Это с линией nums = list(dq) в первой функции. Это переназначает имя num другому объекту списка локально в функции. Последующая операция замещения работает с локальным объектом, а не с списком, который вы передали.

В примечании не нужно явно преобразовывать dq обратно в список, чтобы назначить его. Это уже итерация, и последовательность, так что вы можете сделать nums[:] = dq просто отлично.

0 голосов
/ 08 февраля 2020

Это происходит из-за ограничения. В первой функции вы присваиваете значение от deque до nums с помощью этого кода nums = list(dq). Это говорит 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.

...