python - 使用嵌套列表索引时 Pythonic 交换导致索引错误
问题描述
我知道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]
解包并分配到左侧,在解包期间评估左侧。
所以
- RHS 元组是用值创建的
(-10, 1)
nums[i]
被指定为 -10- 然后您尝试分配
nums[nums[i]-1]
为1
... 但由于此时nums[i]
已评估并且现在为-10,因此您的索引现在将为-11,从而给出错误。
推荐阅读
- python-3.x - 如何获取字符串日期输入并将其转换为另一种格式?
- c++ - 在 macOS 中处理 VBI 数据
- sql - 如何在带有“时间”字段的 postgresql 中按天和 2 小时分组?
- python - 从 Entry 检测意图而不是手动 Dialogflow 输入
- javascript - 使用 aws cli 将 json 数据上传到本地 dynamo db
- .net - 我在视觉 2017 中没有 bower.json 文件
- c++ - 使用 boost void 分配器是不好的做法吗?
- visual-studio - Visual Studio 2XXX、MSbuild、VC++2XXX、平台工具集和 Windows SDK 兼容性
- php - Woocommerce rest api - 操作超时
- spring - 强制 Spring JPA 插入带有“insertable = false”的列