0

该算法的工作原理如下:

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

问题

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

源代码

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

2 回答 2

3

您的代码只有一个小缺陷。正如@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。

于 2020-12-28T13:53:23.003 回答
1
  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)


指南

于 2020-12-28T13:58:05.287 回答