Python 列表排序算法,意外的列表最后一个元素

问题描述

算法的工作原理如下:

  1. 我找到给定列表的最小值。
  2. 然后弹出它并将其附加到另一个列表中。
  3. 重复第 1 步和第 2 步,直到出现一个元素,在这种情况下,我只需将其附加到另一个列表中并结束程序。

问题

最后一个元素总是一些应该很久以前排序的随机数。

代码

map()

解决方法

您的代码只有一个小缺陷。正如@Tomerikoo 已经指出的那样,迭代器只有一个小错误。 正确的代码如下所示:

lst=[randrange(1,100) for i in range(100)]
lst2=[]
while True:
    if len(lst) > 1:
        min = 0
        for i in range(len(lst)):
                if min == 0:
                    min = lst[i]
                else:
                    if lst[i] < min:
                         min = lst[i]
        for j in range(len(lst)):
            if lst[j] == min:
                lst2.append(lst[j])
                lst.pop(j)
                break
    else:
        lst2.append(lst[0])
        break
lst = lst2
print(lst)

有一个更优雅的实现,它遍历列表项而不仅仅是索引。

lst=[randrange(1,100) for i in range(100)]
lst2=[]
while True:
    if len(lst) > 1:
        min = 0
        for item in lst:
                if min == 0:
                    min = item
                else:
                    if item < min:
                         min = item
        for idx,item in enumerate(lst):
            if item == min:
                lst2.append(item)
                lst.pop(idx)
                break
    else:
        lst2.append(lst[0])
        break
lst = lst2
print(lst)

在您确实需要索引的一种情况下,enumerate 是您选择的工具。这一改进使您的代码总体上更易于阅读,并利用了 Python 的其中一项功能,而不是例如 C。

,
  1. for i in range(len(lst) -1): 改为 for i in range(len(lst)):

  2. 您可以通过直接查找索引来改进算法,而无需进行两次遍历:

from random import randrange


lst = [randrange(1,100) for i in range(100)]
lst2 = []
while True:
    if len(lst) > 1:
        min = 0
        for i in range(len(lst)):  # FIND min value
                if not min:
                    min = lst[i]
                else:
                    if lst[i] < min:
                         min = lst[i]
        get_index = lst.index(min)  # Get index of Value
        min_value = lst.pop(get_index) # Pop min value
        lst2.append(min_value)  # Append min Value
    else:
        lst2.append(lst[0])
        break
lst = lst2
print(lst)


编辑

@MatsLindh & @Tomerikoo 指出 index 函数在内部运行一个循环(所以基本上是一样的)但只是更具可读性

因此以下代码会更简洁,性能更好:

from random import randrange


lst = [randrange(1,100) for i in range(100)]
lst2 = []
while True:
    if len(lst) > 1:
        min = 0
        idx = 0
        for i in range(len(lst)):  # FIND min value
                if not min:
                    min = lst[i]
                    idx = i
                else:
                    if lst[i] < min:
                        min = lst[i]
                        idx = i  #Store Index of min_value
        min_value = lst.pop(idx) # Pop min value
        lst2.append(min_value)  # Append min Value
    else:
        lst2.append(lst[0])
        break
lst = lst2
print(lst)


指南