首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了寻找python代码的简短片段的解释,冒泡排序

为了寻找python代码的简短片段的解释,冒泡排序
EN

Stack Overflow用户
提问于 2021-04-23 18:19:50
回答 2查看 25关注 0票数 0

当我正在阅读关于Bubble排序算法的图书Python讲习班时,我看到了下面的代码片段:

代码语言:javascript
复制
l = [5, 8, 1, 3, 2]
still_swapping = True
while still_swapping:
    still_swapping = False
    for i in range(len(l) - 1):
        if l[i] > l[i+1]:
            l[i], l[i+1] = l[i+1], l[i]
            still_swapping = True

由于我理解代码的前提,逐个比较值并按正确的顺序替换它们,我不明白这里发生了什么:

l[i], l[i+1] = l[i+1], l[i]

当然,我可以自己编写这样的代码,下面是我的初学者版本:

代码语言:javascript
复制
l = [5, 8, 1, 3, 2]
still_swapping = True
while still_swapping:
    still_swapping = False
    for i in range(len(l) - 1):
        if l[i] > l[i+1]:
            temp = l[i]
            l[i] = l[i+1]
            l[i+1] = temp
            still_swapping = True

print(l)

但问题是,书中提供的代码的缩短版本是什么?正在进行什么样的手术?我不懂这里的语法。在书的前几章里找不到。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 18:23:50

代码与缩短代码之间唯一的区别是这一行:

代码语言:javascript
复制
l[i], l[i+1] = l[i+1], l[i]

它所做的是一次分配两个对象。例如,

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

同时分配a = cb = d

这不仅限于变量赋值,还适用于for -循环:

代码语言:javascript
复制
for index, item in enumerate(lst):

这将同时迭代索引和项。

最后要注意的一点是,您一次可以分配超过两个。

代码语言:javascript
复制
a, b, c = 1, 2, 3

会像预期的那样工作。

因此,这段缩短的代码简单地同时分配l[i] = l[i+1]l[i+1] = l[i],从而消除了定义临时变量的额外行的需要。

票数 0
EN

Stack Overflow用户

发布于 2021-04-23 18:25:32

l[i+1], l[i]在右侧创建两个索引值的匿名两个元素元组。元组解压允许您将元组展开为左手侧的变量。就像foo, bar = 1, 2一样,创建的元组中的值被展开到左侧的l[i], l[i+1]中。其效果是交换列表的两个值。

通过分配临时元组,您可以看到交换正在起作用。

代码语言:javascript
复制
>>> l = [1,2]
>>> i = 0
>>> tmp = l[i+1], l[i]
>>> print(tmp)
(2, 1)
>>> l[i], l[i+1] = tmp
>>> print(l)
[2, 1]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67235067

复制
相关文章

相似问题

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