Pythonic swap приводит к ошибке индекса при использовании индекса вложенного списка - PullRequest
0 голосов
/ 31 мая 2018

мне известно, что pythonic swap может быть записан как:

a,b = b,a
list[a], list[b] = list[b], list[a]

, но в моей проблеме я хочу поменять местами элементы в списке, но индекс, который я использую, является значением при определенномпозиция индекса в исходном списке.Это работает так:

скажем, если у меня есть список номеров, которые нужно поменять местами, и у меня есть индекс i.

nums = [-10,-3,-100,-1000,-239,1]  # list to swap
i = 5  # index

, и здесь мы можем предположить

if nums[i] > 0 and nums[i]<=len(nums)

Что я ожидаю после свопинга:

[1, -3, -100, -1000, -239, -10]

следующая команда выдаст мне индекс вне диапазона ошибки:

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]   # gives list assignment out of range error

, в то время как следующая команда работает нормально:

t = nums[i]
nums[i] = nums[t-1]
nums[t-1] = t

Я в замешательстве, и, пожалуйста, дайте мне знать, где я не прав.

1 Ответ

0 голосов
/ 31 мая 2018

Это из-за того, как в Python работает замена двух переменных.

Обратите внимание, что даже если вы получаете AssignmentError, если вы распечатываете свой список впоследствии, у вас есть

>>> nums
[-10, -3, -100, -1000, -239, -10]

Это потому, что как кортеж, созданный в правой части

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

распаковывается и присваивается слева, левая сторона оценивается при распаковке.

Итак,

  • кортеж RHS создается со значением (-10, 1)
  • nums[i], которому присвоено значение -10
  • , а затем выпопробуйте присвоить nums[nums[i]-1] значение 1 ... но поскольку nums[i] оценивается , в этот момент и теперь равно -10, ваш индекс теперь будет -11, что дает ошибку.
...