首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在列表中交换两个元素会显示意外的行为

在列表中交换两个元素会显示意外的行为
EN

Stack Overflow用户
提问于 2017-07-02 03:48:00
回答 2查看 102关注 0票数 8

我有一份清单:

代码语言:javascript
复制
lis = [12,45,15,67,89]

我想交换12和89,这样列表应该看起来

代码语言:javascript
复制
lis = [89,45,15,67,12]

当我这样做的时候

代码语言:javascript
复制
lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]

什么都没有改变

代码语言:javascript
复制
lis = [12,45,15,67,89]

但当我这样做的时候

代码语言:javascript
复制
lis5[0], lis5[4] = lis5[4], lis5[0]

它工作得很完美

代码语言:javascript
复制
lis = [89,45,15,67,12]

那么,为什么它不是第一种方式呢?PS-我想做第一种方法的全部原因是因为我想在列表中找到max元素,然后用列表的第一个元素交换它。

类似于:

代码语言:javascript
复制
max1 = max(lis)
lis[0], lis[lis.index(max1)] = lis[lis.index(max1)], lis[0]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-02 04:24:10

简而言之,在不同的时间计算左/右侧的lis.index(max1),然后将其计算为不同的值(左侧为0,右侧为4 )。

代码语言:javascript
复制
a, b = b, a

上述声明:

  • 创建(b, a)元组
  • 将上述元组解压缩为ab
    • A=b的旧价值
    • B=a的旧价值

代码语言:javascript
复制
lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]

变成了

代码语言:javascript
复制
lis[0], lis[lis.index(89)] = lis[4], lis[0]

=>

代码语言:javascript
复制
lis[0], lis[lis.index(89)] = 89, 0

=>

代码语言:javascript
复制
lis[0] = 89
lis[lis.index(89)] = 0

=>

代码语言:javascript
复制
lis[0] = 89
lis[0] = 0    # NOTE lis.index(89) == 0  at this point

因此,lis[0]分配89,然后分配原始值0返回。=> (只更改了第一个元素,并重新分配原始值)

若要避免此问题,请在交换语句之前分配索引:

代码语言:javascript
复制
idx = lis.index(89)
lis[0], lis[idx] = lis[idx], lis[0]
票数 7
EN

Stack Overflow用户

发布于 2021-02-24 11:30:29

为了扩展已接受的答案,您可以使用dict存储。

代码语言:javascript
复制
lis = [12,45,15,67,89]
new_list = []


dict = {k:v for (k,v) in enumerate(lis)}

    
dict[0], dict[4] = dict[4], dict[0]
    
for i in range(len(lis)):
    new_list.append(dict[i])
   
print(new_list)

还有你尝试的方式,

代码语言:javascript
复制
lis = [12,45,15,67,89]

lis[lis.index(89)], lis[0] = lis[0], lis[lis.index(89)]

print(lis) 

两者都会产生,

代码语言:javascript
复制
[89, 45, 15, 67, 12]

[Program finished]

或者,对于最大值,

代码语言:javascript
复制
lis = [12,45,15,67,89]
max_index = lis.index(max(lis))
lis[0], lis[max_index] = lis[max_index], lis[0]
print(lis) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44867281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档