搜索 python 代码短片的解释,冒泡排序
in search for explanation of short snippet of python code, bubble sort
当我阅读 Python 研讨会这本书时,关于冒泡排序算法的主题,我看到了这段代码:
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)
但问题是,书中提供的代码的简化版本是什么?正在进行什么样的操作?我不明白这里的语法。在书的前几章还真找不到。
提前致谢!
您的代码与缩短的代码之间的唯一区别是这一行:
l[i], l[i+1] = l[i+1], l[i]
它的作用是一次分配 2 个对象。例如,
a, b = c, d
同时赋值a = c
和b = 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]
,因此不需要额外的一行来定义临时变量。
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]
当我阅读 Python 研讨会这本书时,关于冒泡排序算法的主题,我看到了这段代码:
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)
但问题是,书中提供的代码的简化版本是什么?正在进行什么样的操作?我不明白这里的语法。在书的前几章还真找不到。
提前致谢!
您的代码与缩短的代码之间的唯一区别是这一行:
l[i], l[i+1] = l[i+1], l[i]
它的作用是一次分配 2 个对象。例如,
a, b = c, d
同时赋值a = c
和b = 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]
,因此不需要额外的一行来定义临时变量。
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]