【问题标题】:Pythonic swap result in index error when using nested list index使用嵌套列表索引时,Pythonic 交换导致索引错误
【发布时间】:2018-05-31 19:17:04
【问题描述】:

据我所知,pythonic swap 可以写成:

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

但在我的问题中,我想交换列表中的元素,但我使用的索引是原始列表中某个索引位置的值。它的工作原理是这样的:

如果我有一个要交换的列表 nums,并且我有一个索引 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

我很困惑,请让我知道我错在哪里。

【问题讨论】:

  • 为什么你用列表中的一个元素而不是i-1来索引。我想你想要nums[i], nums[i-1] = nums[i-1], nums[i]

标签: python list swap


【解决方案1】:

这是因为在 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 ,给出错误。

【讨论】:

  • 谢谢,这回答了我的问题,我从来不知道 pythonic 交换是用元组完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多