【问题标题】:Swapping elements in lists in python在python中交换列表中的元素
【发布时间】:2015-01-13 21:52:37
【问题描述】:

我有一个列表,我需要将列表中的第一个元素与列表中的最大元素交换。

但为什么代码 1 有效而代码 2 无效:

代码 1:

a = list.index(max(list))
list[0], list[a] = list[a], list[0]

代码 2:

list[0], list[list.index(max(list))] = list[list.index(max(list))], list[0]

我认为 Python 会先评估右侧,然后再将其分配给左侧的名称?

【问题讨论】:

  • 我对这个问题的激进投票感到有点困惑。如果您不知道分配目标的评估顺序发生了什么,这确实是令人费解的行为。
  • @MartijnPieters 没错,这就是为什么我对人们的行为感到非常惊讶的原因,因为这个可怜的家伙有 10 的声誉,而且对于编程和这个网站来说肯定是新手。
  • @MartijnPieters 可能是,但我认为由于缺乏研究,人们正在投票。

标签: python list swap


【解决方案1】:

Python 从从左到右将结果存储在多个目标中,按该顺序执行赋值目标表达式。

所以你的第二个版本基本上归结为:

temp = list[list.index(max(list))],list[0]
list[0] = temp[0]
list[list.index(max(list))] = temp[1]

请注意,list.index(max(list)) 是在 list[0] 被更改之后执行的,这就是您刚刚存储最大值的位置。

这记录在Assignment statements documenation:

  • 如果目标列表是逗号分隔的目标列表:该对象必须是与目标列表中的目标具有相同数量的项目的可迭代对象,并且从左到右分配项目,到相应的目标。

从那里开始,每个目标都好像是一个目标,因此下面的文档从左到右适用于每个目标:

将对象分配给单个目标的递归定义如下。

[...]

  • 如果目标是订阅:计算引用中的主要表达式。它应该产生一个可变序列对象(例如列表)或映射对象(例如字典)。接下来,计算下标表达式。

如果您更改了分配顺序,您的代码将起作用:

list[list.index(max(list))], list[0] = list[0], list[list.index(max(list))]

因为现在list[list.index(max(list))] 被分配给first

【讨论】:

  • 换句话说,list[list.index(max(list))], list[0]=list[0],list[list.index(max(list))] 按预期工作。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2011-06-01
  • 2017-10-23
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多