python列表从小到大排列&获取list中重复元素索引的方法
将list中的数据从小到大排列,生成数据排列后的新列表,和其一一对应的索引值。
但是列表中有重复数据时,用for循环遍历的方式只能找到重复值中的第一个索引,生成的索引无法一一对应。
生成一个copylist,获取重复数值索引时,在copylist中将已获取的重复值清零(下次查询索引,就查不到它,直接与此重复值相等的的后一个值)
import copy
a = [13,1,5,8,9,7,5,1,4,8,7,6,5,14,5,7,9,8,9] # 原始数据
a_copy = copy.deepcopy(a) # copy数据用于查询index
newa = [] # 创建排序后数据的容器
newa_index = []
while len(a) >= 1: #
mina = min(a) # 因为是从小到大排序,所以找最小值
newa.append(mina) # 找到后直接放入新容器
idb = [i for i, x in enumerate(a_copy) if x == mina] #找最小值的索引
if len(idb) == 1: # 如果此最值无重复,那么idb只返回一个值,但是是以list形式
newa_index.append(idb[0]) # 将index放入新容器
else: # 若idb返回值不是一个,说明此最小值有重复值
newa_index.append(idb[0]) # 将第一个值的索引放入容器
a_copy[idb[0]] = 0 # 将重复值中的第一个值赋0(如果要排序的列表中没有0,有0,就随便赋值一个排序列表中没有的数据)
a.remove(mina) # 将排序列表中的最小值删除,以便下次寻找新的最小值
# 当排序列表最后只剩一个值时,停止循环
print(newa)
print(newa_index)
结果:
newa:[1, 1, 4, 5, 5, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 13, 14]
newa_index:[1, 7, 8, 2, 6, 12, 14, 11, 5, 10, 15, 3, 9, 17, 4, 16, 18, 0, 13]