使用 min 和两次遍历 list1:
list1=[1,15,9,3,6,21,10,11]
mn = min(list1)
mn2 = min(i for i in list1 if i != mn)
print((mn,mn2))
(1, 3)
list1=[1,1,9,3,6,21,10,11],其中最小的是骗子,他仍将返回 1,3,而 nsmallest 将返回 1,1,因此需要注意。
您也可以一次性完成,因为您没有受骗者:
def min_two(lst):
mn1, mn2 = float("inf"),float("inf")
for ele in lst:
if ele < mn1:
mn1 = ele
continue
if ele < mn2:
mn2 = ele
return mn1, mn2
这将比heapq.nsmallest 更快:
In [34]:list1=[random.random() for j in range(10**5)]
In [35]: timeit heapq.nsmallest(2,list1)
100 loops, best of 3: 11.6 ms per loop
In [36]: timeit min_two(list1)
100 loops, best of 3: 9.01 ms per loop
In [37]: %timeit sorted(list1)[:2]
10 loops, best of 3: 42.2 ms per l
如果你真的想处理骗子:
def min_two_dupes(lst):
mn1, mn2 = float("inf"),float("inf")
for ele in lst:
if ele < mn1:
mn1 = ele
continue
if ele < mn2 and ele != mn1:
mn2 = ele
return mn1, mn2
忽略重复将得到两个最小的数字:
In [48]: list1 = [12, 15, 3, 3, 6, 21, 10, 11]
In [49]: min_two_dupes(list1)
Out[49]: (3, 6)
并且运行同样高效:
In [52]: timeit min_two_dupes(list1)
100 loops, best of 3: 9.04 ms per loop