sorted()排列小结

本文介绍如何使用Python的sorted()函数对包含姓名和成绩的元组列表进行排序,首先按姓名排序,然后按成绩从高到低排序。通过定义辅助函数实现自定义排序规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习 
假设我们用一组 tuple 表示学生名字和成绩: 
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] 

请用 sorted()对上述列表分别按名字排序

再按成绩从高到低排序

def by_name(t):
    return t[0]
def by_score(t):
    return t[1]
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88),('Ava', 88)]
L2=sorted(L,key=by_name)
print(L2)
L3=sorted(L2,key=by_score,reverse=True)
print(L3)

思路:看到这个题的第一反应是,怎么能够把名字和分数分离开来,在去比较大小。

       写题的时候没有理解sorted()的真正所在

sorted(L,key=(注:这里可以调用函数),reverse=(注:True让排序从大到小))

sorted()是一个排序函数,key值是为了定义自己的函数排序的规则,key中的函数是处理数据用的,

sorted()高阶函数是用来排序,默认是从小到大排列,字符比较是ASCII决定的。

# 加载ggplot2包用于数据可视化 library(ggplot2) # 加载tidyr包用于数据整理,这里主要使用pivot_longer函数 library(tidyr) # 数据准备 # 从指定路径读取CSV文件数据 data <- read.csv("E:/学校/大二下/R语言与生物统计分析/结课论文/试题及数据/data.csv") # 按照Combined降序排序数据 data_sorted <- data[order(-data$Combined), ] # 将Country转换为因子,并按Combined降序排列的顺序设置因子水平(反转顺序) data_sorted$Country <- factor(data_sorted$Country, levels = rev(data_sorted$Country)) # 转换为长格式(从宽数据转换为长数据) data_long <- pivot_longer( data_sorted, # 输入数据框 cols = c(Combined, Male, Female), # 指定要转换的 names_to = "Variable", # 新生成的包含原名的名 values_to = "Value" # 新生成的包含原值的名 ) # 确保Variable因子顺序正确(按指定顺序排列图例) data_long$Variable <- factor(data_long$Variable, levels = c("Combined", "Male", "Female")) # 可视化实现 # 使用ggplot函数创建图形对象,以Country为x轴 ggplot(data_long, aes(x = Country)) + # 添加背景线层,每个国家一条灰色线 geom_line( aes(y = Value, group = Country), # y轴为Value,按Country分组 color = "#D3D3D3", # 浅灰色 linewidth = 3, # 线宽增加到2.5(原注释中提到从0.8调整为2.5) alpha = 0.7 # 透明度70% ) + # 添加数据点层,根据Variable填充不同颜色 geom_point( aes(y = Value, fill = Variable), # y轴为Value,填充颜色由Variable决定 size = 4, # 点大小为4 shape = 21, # 使用带边框的圆形(可填充) color = "white", # 边框颜色为白色 stroke = 0.5, # 边框粗细0.5 position = position_dodge(width = 0.4) # 相同x轴位置的点横向错开0.4 ) + # 翻转坐标轴(将x轴和y轴互换) coord_flip() + # 使用简约主题 theme_minimal() + # 手动设置填充颜色(Combined为深蓝色,Male为钢蓝色,Female为橙色) scale_fill_manual( values = c(Combined = 'navy', Male = 'steelblue', Female = 'orange'), labels = c('Combined', 'Male', 'Female') # 设置图例标签 ) + # 设置y轴属性(实际为翻转后的x轴) scale_y_continuous( limits = c(35, 55), # 设置y轴范围从35到55 breaks = seq(40, 55, 5), # 设置刻度为40、45、50、55 expand = expansion(mult = c(0, 0.01)), # 设置y轴扩展(右侧扩展10%) position = "right", # 将y轴标签放在右侧 name = "" # 不显示y轴标题 ) + # 设置图表标题、x轴和y轴标签 labs( title = "Germany is the third-oldest country in the world", x = "", # 不显示x轴标题(实际为翻转后的y轴) y = "" # 不显示y轴标题(实际为翻转后的x轴) ) + # 自定义主题设置 theme( plot.title = element_text(hjust = 0.5, face = "bold", margin = margin(b = 15)), # 标题居中、加粗,下方边距15 panel.grid.major.y = element_line(color = "grey90"), # 设置y轴主要网格线为浅灰色 panel.grid.major.x = element_line(color = "grey90"), # 设置x轴主要网格线为浅灰色 axis.text.y = element_text(size = 8, margin = margin(r = 5)), # 设置y轴文本大小和右边距 legend.position = "bottom", # 图例位置在底部 legend.direction = "horizontal", # 图例水平排列 legend.justification = "left", # 图例左对齐 legend.title = element_blank(), # 不显示图例标题 legend.box.spacing = unit(1, "cm"), # 图例框间距0.5厘米 legend.background = element_blank(), # 图例背景透明 plot.margin = margin(20, 20, 30, 20), # 设置图表边距(上、右、下、左) axis.ticks.length = unit(0, "pt") # 不显示坐标轴刻度线 ) + # 自定义图例样式 guides(fill = guide_legend( nrow = 1, # 图例一行显示 label.position = "right", # 图例标签在右侧 keywidth = unit(0.5, "cm"), # 图例键宽度0.5厘米 keyheight = unit(0.3, "cm"), # 图例键高度0.3厘米 label.theme = element_text(size = 9, margin = margin(t = 3)) # 图例标签大小和上边距 )) 将表格中的数据点在同一直线上
最新发布
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值