1.获取list中最大的n个数及其索引,代码如下:
import heapq
import copy
def find_max_nums(nums, find_nums):
if len(nums) == len(list(set(nums))):
# 使用heapq
max_number = heapq.nlargest(find_nums, nums)
max_num_index = list(map(nums.index, max_number))
else:
# 使用deepcopy
nums_copy = copy.deepcopy(nums)
min_num = min(nums) - 1
max_num_index = []
max_number = []
for i in range(find_nums):
num_max = max(nums_copy)
num_index = nums_copy.index(num_max)
max_number.append(num_max)
max_num_index.append(num_index)
nums_copy[num_index] = min_num
return max_num_index, max_number
find_nums = 3
nums = [1, 8, 2, 23, 7, -4] # list不含重复元素
max_num_index, max_number = find_max_nums(nums, find_nums)
print('索引:', max_num_index) # 输出结果为[3, 1, 4]
print('元素值:', max_number) # 输出结果为[23, 8, 7]
nums = [1, 7, 2, 23, 7, -4] # list含重复元素7
max_num_index, max_number = find_max_nums(nums, find_nums)
print('索引:', max_num_index) # 输出结果为[3, 1, 4]
print('元素值:', max_number) # 输出结果为[23, 7, 7]
2.获取list中最小的n个数及其索引,代码如下:
import heapq
import copy
def find_min_nums(nums, find_nums):
if len(nums) == len(list(set(nums))):
# 使用heapq
min_number = heapq.nsmallest(find_nums, nums)
min_num_index = list(map(nums.index, min_number))
else:
# 使用deepcopy
nums_copy = copy.deepcopy(nums)
max_num = max(nums) + 1
min_num_index = []
min_number = []
for i in range(find_nums):
num_min = min(nums_copy)
num_index = nums_copy.index(num_min)
min_number.append(num_min)
min_num_index.append(num_index)
nums_copy[num_index] = max_num
return min_num_index, min_number
find_nums = 3
nums = [1, 8, 2, 23, 7, -4] # list不含重复元素
min_num_index, min_number = find_min_nums(nums, find_nums)
print('索引:', min_num_index) # 输出结果为[5, 0, 2]
print('元素值:', min_number) # 输出结果为[-4, 1, 2]
nums = [1, 1, 2, 23, 7, -4] # list含重复元素1
min_num_index, min_number = find_min_nums(nums, find_nums)
print('索引:', min_num_index) # 输出结果为[5, 0, 1]
print('元素值:', min_number) # 输出结果为[-4, 1, 1]
3.上述代码整合思路如下:
Python获取list中最大或最小的n个数及其索引,主要有两种方法:
使用heapq包中最大值/最小值函数:nlargest() / nsmallest(),如求list中前3个最小值,代码如下:
import heapq
nums = [1, 8, 2, 23, 7, -4]
find_nums = 3
min_num_list = list(map(nums.index, heapq.nsmallest(find_nums, nums)))
print(min_num_list) # [5, 0, 2]
借助copy包中的deepcopy()函数,在副本数据上进行搜索/修改, 如求list中前3个最小值,代码如下:
import copy
nums = [1, 8, 2, 23, 7, -4]
find_nums = 3
nums_copy = copy.deepcopy(nums)
max_num = max(nums) + 1
min_num_list = []
for i in range(find_nums):
num_index = nums_copy.index(min(nums_copy))
min_num_list.append(num_index)
nums_copy[num_index] = max_num
print(min_num_list) # [5, 0, 2]
当list中包含重复元素时,使用方法1会造成索引不匹配,如下:
import heapq
nums = [1, 1, 2, 23, 7, -4]
find_nums = 3
min_num_list = list(map(nums.index, heapq.nsmallest(find_nums, nums)))
print(min_num_list)
输出结果为[5, 0, 0],正确结果应该为:[5, 0, 1].
因此,将两种方法整合如下,即可得到正确结果.即上两小结的代码.