使用嵌套列表索引时 Pythonic 交换导致索引错误

标签 python list swap

据我所知,pythonic 交换可以写成:

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

我很困惑,请告诉我我哪里错了。

最佳答案

这是因为 Python 中交换两个变量的工作方式。

请注意,即使您收到 AssignmentError,如果您随后打印出您的列表

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

这是因为在

右侧创建的元组
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

被解包并分配到左侧,在解包期间评估左侧。

所以

  • 使用值 (-10, 1) 创建 RHS 元组
  • nums[i] 被指定为 -10
  • 然后您尝试将 nums[nums[i]-1] 指定为 1...但是由于 nums[i] > 此时评估并且现在为-10,您的索引现在将为-11,给出错误。

关于使用嵌套列表索引时 Pythonic 交换导致索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50631323/

相关文章:

python - 用于 Django 项目/应用程序的 RESTful API

arrays - 高效的数据结构,用于快速随机访问、搜索、插入和删除

python - 将元组列表格式化并打印为一行

c - 使用交换功能是否错误?

c++ - Qt:交换 QGraphicsRectItem 位置的最佳方法是什么

python - 是什么导致了这个 Python 语法错误?

python - 在 Altair 中将图像添加到图表页脚

c - 用指针交换数组索引函数

python - 模型未定义

javascript - SapUI5:带有另一个列表项的切换(隐藏/显示)的列表项