赞
踩
K = 3
a = list(range(20)) # 无重复元素
Nmax_val_lis, Nmax_idx_lis = [], []
for _ in range(K):
max_val = max(a)
max_idx = a.index(max_val)
Nmax_val_lis.append(max_val)
Nmax_idx_lis.append(max_idx)
a[max_idx] = float('-inf')
print(Nmax_val_lis)
print(Nmax_idx_lis)
运行结果:
取列表前K个最小元素也是同理,代码及运行结果如下:
K = 3
a = [0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9] # 存在重复元素
Nmin_val_lis, Nmin_idx_lis = [], []
for _ in range(K):
min_val = min(a)
min_idx = a.index(min_val)
Nmin_val_lis.append(min_val)
Nmin_idx_lis.append(min_idx)
a[min_idx] = float('inf')
print(Nmin_val_lis)
print(Nmin_idx_lis)
运行结果:
从运行结果来看,K次循环的方法同样适用于存在重复元素的列表,所以该方法适用性很好。
import heapq
K = 3
a = list(range(10)) # 无重复元素
max_val_lis = heapq.nlargest(K, a)
max_idx_lis = list(map(a.index, max_val_lis))
print(max_val_lis)
print(max_idx_lis)
运行结果:
如果寻找列表的前K个最小值及索引也同理,使用heapq.nsmallest(K, a)。
import heapq
K = 3
a = [0, 1, 2, 3, 7, 7, 8, 8, 9, 9]
max_val_lis = heapq.nlargest(K, a)
max_idx_lis = list(map(a.index, max_val_lis))
print(max_val_lis)
print(max_idx_lis)
运行结果:
由于列表中最大值为9 9 8,对应索引分别是9 8 7/6,但是索引8重复输出了两次,索引9未被输出,这是因为list.index(val)方法只会输出list中val第一次出现的位置索引。因此有重复元素时,heapq.nlargest(K, a)方法不再适用!
参考方法一,做如下修改:
import heapq
K = 3
a = [0, 1, 2, 3, 7, 7, 8, 8, 9, 9]
max_val_lis = heapq.nlargest(K, a)
max_idx_lis = []
for item in max_val_lis:
idx = a.index(item)
max_idx_lis.append(idx)
a[idx] = float('-inf')
print(max_val_lis)
print(max_idx_lis)
运行结果:
(本文完整的pdf请关注公众号“张张学算法”,并回复“016”获取~)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。