如何实现列表的跟随排序
两个list元素一一对应,一个list进行排序,另一个list上的元素也跟着排序,保持一一对应关系
0 参考资料
python 两个list元素一一对应,一个list进行排序,另一个list上的元素也跟着排序,保持一一对应关系_python两个列表元素一一对应-CSDN博客
1 引例
现在有三个列表,三个列表含义具有对应性
name = ['zhangsan','lisi','wangwu']
math_grade = [82,90,81]
Engilish_grade = [100,89,99]
需求1:我想对math_grade进行排序,然后对应的name列表中也对应变化(即name列表跟随math_grade变化)
需求2:先对于math_grade进行排序,如果成绩相等则根据English_grade进行排序,然后对应的name列表页对应变化(未解决)
2 需求1—解决办法
(1)解决办法一:通过python内置的zip
和sorted
函数
step1: 将两个列表通过zip函数
联和联和两个列表
name = ['zhangsan','lisi','wangwu']
math_grade = [82,90,81]
name_math_grade = list(zip(name,math_grade))
print(name_math_grade)
输出结果
[('zhangsan', 82), ('lisi', 90), ('wangwu', 81)]
step2:然后通过sorted函数
指定key=参数
其参数为某个函数(匿名函数)
常用的有
(1)根据某个元素位置进行排序(即根据某一个列表进行排序,然后另一个列表跟随变化)
sorted(lst,key=lambda x:x[0])
(2)根据某个列表的长度进行排序
sorted(lst,key=lambda x:len(x[0]))
sorted_name_math_grade = sorted(name_math_grade,key=lambda x:x[1])
输出结果
[('wangwu', 81), ('zhangsan', 82), ('lisi', 90)]
step3:将排序好的列表进行拆分
result = zip(*sorted_name_math_grade)
sorted_name, sorted_math_grade = [list(x) for x in result]
print(sorted_name)
print(sorted_math_grade)
输出结果
['wangwu', 'zhangsan', 'lisi']
[81, 82, 90]
(2)纯算法—归根到底还是排序算法
根据排序算法,先对一个列表math_grade
进行排序,然后记录各个元素的最终位置,然后在将另一个列表name
根据上述的各个元素最终位置也进行调整
基于冒泡排序
name = ['zhangsan', 'lisi', 'wangwu']
math_grade = [82, 90, 81]
# 冒泡排序函数
def bubble_sort(arr1,arr2):
"""
根据arr1,arr2跟随变化
"""
n = len(arr1)
# 遍历所有元素
for i in range(n):
# 对未排序部分进行比较并交换
for j in range(0, n-i-1):
if arr1[j] > arr1[j+1]:
# 交换arr1
arr1[j], arr1[j+1] = arr1[j+1], arr1[j]
# 交换arr2
arr2[j], arr2[j+1] = arr2[j+1], arr2[j]
# 对数学成绩进行交换排序
bubble_sort(math_grade,name)
# 输出排序后的结果
print("排序后的名字列表:", name)
print("对应的数学成绩列表:", math_grade)
输出结果
排序后的名字列表: ['wangwu', 'zhangsan', 'lisi']
对应的数学成绩列表: [81, 82, 90]
基于选择排序
# 初始列表
name = ['zhangsan', 'lisi', 'wangwu']
math_grade = [82, 90, 81]
# 选择排序函数
def selection_sort(arr1,arr2):
"""
根据arr1,arr2跟随变化
"""
n = len(arr1)
# 遍历所有元素
for i in range(n):
min_index = i
# 在未排序部分找到最小值的索引
for j in range(i+1, n):
if arr1[j] < arr1[min_index]:
min_index = j
# 将最小值交换至未排序部分的开头
arr1[i], arr1[min_index] = arr1[min_index], arr1[i]
# 同时将对应的姓名也进行交换
arr2[i], arr2[min_index] = arr2[min_index], arr2[i]
# 对数学成绩进行选择排序
selection_sort(math_grade,name)
# 输出排序后的结果
print("排序后的名字列表:", name)
print("对应的数学成绩列表:", math_grade)
(3)通过pandas库来解决(降维打击)
step1:根据两个列表创建DataFrame对象
step2:通过pandas库中DataFrame
对象中sort_values
方法中by=参数
可以指定多个
import pandas as pd
# 初始列表
name = ['zhangsan', 'lisi', 'wangwu']
math_grade = [82, 90, 81]
# 创建DataFrame
df = pd.DataFrame({'Name': name, 'Math Grade': math_grade})
# 根据数学成绩进行排序
df_sorted = df.sort_values(by='Math Grade')
# 输出排序后的结果
print(df_sorted)
Name Math Grade
2 wangwu 81
0 zhangsan 82
1 lisi 90