Python:按升序排序
Python: sorting by increasing order
我正在尝试编写一个程序,给定一个列表,该程序将按照递增的数学顺序对元素进行排序。例如,如果输入为 [2,4,3,1,5],则输出为 [1,2,3,4,5]。我的代码是:
def trival(liste):
i=0
l=len(liste)
while i+1<=l-1:
a=liste[i]
b=liste[i+1]
if a>b:
a,b=b,a
print (liste)
i=i+1
但是,在我收到的输出中:
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
显然这是错误的。有什么建议吗?
以下语句不影响列表。它只是交换 a
, b
.
的值
a, b = b, a
您需要使用列表项分配来交换列表项:
liste[i], liste[i+1] = liste[i+1], liste[i]
>>> liste = [5, 4, 3]
>>> i = 0
>>> a = liste[i]
>>> b = liste[i+1]
>>> a, b = b, a
>>> a # a, b value changed
4
>>> b
5
>>> liste # but not for the list.
[5, 4, 3]
>>> liste[i], liste[i+1] = liste[i+1], liste[i]
>>> liste
[4, 5, 3]
顺便说一句,如果你正在实施冒泡排序,你需要迭代更多(直到没有交换发生)
您只对列表进行一次传递,因此您只对相邻元素进行排序。你还需要做:
liste[i], liste[i+1] = liste[i+1], liste[i]
而不是:
a, b = b, a
如果您真的想更改列表。我想这就是你想要做的:
def trival(liste):
for j in range(len(liste)-1, 0 ,-1):
for i in range(j):
if liste[i]>liste[i+1]:
liste[i+1],liste[i]=liste[i],liste[i+1]
print (liste)
>>> trival([2,4,3,1,5])
[2, 3, 1, 4, 5]
[2, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
您需要将项目分配回各自的索引。
交换后,if a>b: ...
添加以下代码:
liste[i] = a
liste[i+1] = b
正如代码所示,您提取 i 和 i+1 处的元素,将它们存储在单独的变量中。但是 a 和 b 不 "know" 它们属于列表。它们只是价值观。
你的问题出在这里:
if a>b:
a, b = b, a
这不会交换元素,只会交换本地名称。您必须重新分配列表中的元素:
liste[i] = a
liste[i+1] = b
或者只使用列表中的值,而不使用 a
和 b
。您还可以使用 for
循环而不是 while 循环,使您的代码:
def trival(liste):
for i in range(len(liste) - 1):
if liste[i] > liste[i+1]:
liste[i], liste[i+1] = liste[i+1], liste[i]
print(liste)
这会产生以下输出:
[2, 4, 3, 1, 5]
[2, 3, 4, 1, 5]
[2, 3, 1, 4, 5]
[2, 3, 1, 4, 5]
如果你正在实施冒泡排序,你将需要迭代直到没有更多的交换,所以你可以使用一个变量来跟踪:
def trival(liste):
sorted = False
while not sorted:
sorted = True
for i in range(len(liste) - 1):
if liste[i] > liste[i+1]:
liste[i], liste[i+1] = liste[i+1], liste[i]
sorted = False
print(liste)
return liste
产生 [1, 2, 3, 4, 5]
的正确结果。请注意,您可能想要复制列表和 return 排序后的副本,而不是就地排序。
我正在尝试编写一个程序,给定一个列表,该程序将按照递增的数学顺序对元素进行排序。例如,如果输入为 [2,4,3,1,5],则输出为 [1,2,3,4,5]。我的代码是:
def trival(liste):
i=0
l=len(liste)
while i+1<=l-1:
a=liste[i]
b=liste[i+1]
if a>b:
a,b=b,a
print (liste)
i=i+1
但是,在我收到的输出中:
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
[2, 4, 3, 5, 1]
显然这是错误的。有什么建议吗?
以下语句不影响列表。它只是交换 a
, b
.
a, b = b, a
您需要使用列表项分配来交换列表项:
liste[i], liste[i+1] = liste[i+1], liste[i]
>>> liste = [5, 4, 3]
>>> i = 0
>>> a = liste[i]
>>> b = liste[i+1]
>>> a, b = b, a
>>> a # a, b value changed
4
>>> b
5
>>> liste # but not for the list.
[5, 4, 3]
>>> liste[i], liste[i+1] = liste[i+1], liste[i]
>>> liste
[4, 5, 3]
顺便说一句,如果你正在实施冒泡排序,你需要迭代更多(直到没有交换发生)
您只对列表进行一次传递,因此您只对相邻元素进行排序。你还需要做:
liste[i], liste[i+1] = liste[i+1], liste[i]
而不是:
a, b = b, a
如果您真的想更改列表。我想这就是你想要做的:
def trival(liste):
for j in range(len(liste)-1, 0 ,-1):
for i in range(j):
if liste[i]>liste[i+1]:
liste[i+1],liste[i]=liste[i],liste[i+1]
print (liste)
>>> trival([2,4,3,1,5])
[2, 3, 1, 4, 5]
[2, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
您需要将项目分配回各自的索引。
交换后,if a>b: ...
添加以下代码:
liste[i] = a
liste[i+1] = b
正如代码所示,您提取 i 和 i+1 处的元素,将它们存储在单独的变量中。但是 a 和 b 不 "know" 它们属于列表。它们只是价值观。
你的问题出在这里:
if a>b:
a, b = b, a
这不会交换元素,只会交换本地名称。您必须重新分配列表中的元素:
liste[i] = a
liste[i+1] = b
或者只使用列表中的值,而不使用 a
和 b
。您还可以使用 for
循环而不是 while 循环,使您的代码:
def trival(liste):
for i in range(len(liste) - 1):
if liste[i] > liste[i+1]:
liste[i], liste[i+1] = liste[i+1], liste[i]
print(liste)
这会产生以下输出:
[2, 4, 3, 1, 5]
[2, 3, 4, 1, 5]
[2, 3, 1, 4, 5]
[2, 3, 1, 4, 5]
如果你正在实施冒泡排序,你将需要迭代直到没有更多的交换,所以你可以使用一个变量来跟踪:
def trival(liste):
sorted = False
while not sorted:
sorted = True
for i in range(len(liste) - 1):
if liste[i] > liste[i+1]:
liste[i], liste[i+1] = liste[i+1], liste[i]
sorted = False
print(liste)
return liste
产生 [1, 2, 3, 4, 5]
的正确结果。请注意,您可能想要复制列表和 return 排序后的副本,而不是就地排序。