【问题标题】:in search for explanation of short snippet of python code, bubble sort [duplicate]寻找对python代码短片段的解释,冒泡排序[重复]
【发布时间】:2021-07-17 23:07:30
【问题描述】:

当我在阅读 Python Workshop 这本书时,关于冒泡排序算法的主题,我发现了这段代码:

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]

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

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)

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

提前致谢!

【问题讨论】:

    标签: python bubble-sort


    【解决方案1】:

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

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

    它的作用是一次分配 2 个对象。例如,

    a, b = c, d
    

    同时分配a = cb = d

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

    for index, item in enumerate(lst):
    

    这将同时遍历索引和项目。

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

    a, b, c = 1, 2, 3
    

    将按预期工作。

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

    【讨论】:

      【解决方案2】:

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

      您可以通过分配该临时元组来查看交换操作。

      >>> 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]
      

      【讨论】:

        猜你喜欢
        • 2018-03-15
        • 1970-01-01
        • 2018-07-10
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2017-03-19
        相关资源
        最近更新 更多