Python如何不排序天数列表即可关联月份列表与对应天数?
无需排序天数列表实现月份天数关联的解决方案
首先需要说明:你提到的「先对天数列表排序再拼接两个列表」的方案本身存在逻辑问题,排序后的t1顺序为[28,30,30,30,30,31,31,31,31,31,31,31],和公历月份的实际天数顺序完全不匹配,拼接后会出现1月对应28天的错误,无法得到目标结果。
无需排序t1的实现方法有两种,可根据使用场景选择:
方案1:基于公历固定规则直接拼接
如果不需要强制复用t1的元素,直接用公历非闰年的月份天数规则匹配月份列表即可,代码实现最简洁:
# 原始输入列表 t1 = [28,31,31,30,31,30,31,31,31,30,30,31] t2 = ['Jan','Feb','March','Avr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] # 目标结果使用的月份别名映射(匹配输出中的月份拼写要求) month_alias = { 'Jan': 'Jan', 'Feb': 'Fev', 'March': 'Mars', 'Avr': 'Avr', 'May': 'Mai', 'Jun': 'Juin', 'Jul': 'Juil', 'Aug': 'Aout', 'Sep': 'Sep', 'Oct': 'Oct', 'Nov': 'Nov', 'Dec': 'Dec' } # 公历非闰年各月天数,和t2顺序一一对应 correct_days_order = [31,28,31,30,31,30,31,31,30,31,30,31] result = [] for month, days in zip(t2, correct_days_order): result.append(month_alias[month]) result.append(days) print(result)
输出结果和要求的目标完全一致:['Jan', 31, 'Fev', 28, 'Mars', 31, 'Avr', 30, 'Mai', 31, 'Juin', 30, 'Juil', 31, 'Aout', 31, 'Sep', 30, 'Oct', 31, 'Nov', 30, 'Dec', 31]
方案2:强制复用原始t1元素,不排序
如果要求必须使用给定的t1中的元素,不能手动写天数顺序,也不允许排序,可先统计t1内各天数的数量,再按月份规则取用:
from collections import Counter # 原始输入列表 t1 = [28,31,31,30,31,30,31,31,31,30,30,31] t2 = ['Jan','Feb','March','Avr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] month_alias = { 'Jan': 'Jan', 'Feb': 'Fev', 'March': 'Mars', 'Avr': 'Avr', 'May': 'Mai', 'Jun': 'Juin', 'Jul': 'Juil', 'Aug': 'Aout', 'Sep': 'Sep', 'Oct': 'Oct', 'Nov': 'Nov', 'Dec': 'Dec' } # 统计t1中各天数的剩余可用数量 days_stock = Counter(t1) # 定义每个月对应的正确天数 month_days_rule = { 'Jan': 31, 'Feb':28, 'March':31, 'Avr':30, 'May':31, 'Jun':30, 'Jul':31, 'Aug':31, 'Sep':30, 'Oct':31, 'Nov':30, 'Dec':31 } result = [] for month in t2: target_days = month_days_rule[month] result.append(month_alias[month]) result.append(target_days) # 扣除对应天数的库存,确保用的是t1中的元素 days_stock[target_days] -= 1 # 验证所有t1元素都已用完,无遗漏无多余 assert all(stock == 0 for stock in days_stock.values()) print(result)
输出结果和目标完全一致,全程没有对t1做排序操作。
内容的提问来源于stack exchange,提问作者Maryam Ouafik
相关产品推荐
相关产品推荐

