我正在尝试编写一个程序,给定一个列表,将按增加的数学顺序对元素进行排序。例如,如果输入为[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]
显然这是错的。有什么建议吗?
答案 0 :(得分:2)
以下声明不会影响列表。它只是交换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]
顺便说一句,如果你要实现冒泡排序,你需要迭代更多(直到没有掉期)
答案 1 :(得分:0)
您只在列表中执行一次传递,因此您只需订购相邻元素。你还需要这样做:
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]
答案 2 :(得分:0)
您需要将项目分配回各自的索引。
交换后,if a>b: ...
添加以下代码:
liste[i] = a
liste[i+1] = b
如代码所示,您在i和i + 1处提取元素,将它们存储在单独的变量中。但是a和b并不“知道”它们属于列表。它们只是价值观。
答案 3 :(得分:0)
你的问题在于:
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]
的正确结果。请注意,您可能希望复制列表,并返回已排序的副本,而不是就地排序。