问题描述
算法的工作原理如下:
问题
源代码
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。
-
将
for i in range(len(lst) -1):
改为for i in range(len(lst)):
-
您可以通过直接查找索引来改进算法,而无需进行两次遍历:
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)