Python:按递增顺序排序

时间:2015-01-03 15:13:09

标签: python list

我正在尝试编写一个程序,给定一个列表,将按增加的数学顺序对元素进行排序。例如,如果输入为[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]

显然这是错的。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

以下声明不会影响列表。它只是交换ab的值。

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

或者只使用列表中的值,而不是使用ab。您也可以使用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]的正确结果。请注意,您可能希望复制列表,并返回已排序的副本,而不是就地排序。