如何在Python3中结合datetime与lambda合并排序含日期列表
问题分析与修复方案
代码中的核心问题
- 合并列表逻辑错误:
mergeLists函数循环时错误地将整个list1/list2添加到newList,而非单条记录元素。导致newList的元素是完整子列表,而非预期的单条数据,后续排序必然出错(虽然长度显示为6,但内容结构完全错误)。 - 日期解析语法错误:
sorted的key函数中,datetime.strptime缺少日期格式参数,且重复调用datetime.datetime(已导入datetime,直接调用即可)。 - 冗余代码:
get_list1和get_list2功能完全一致,可合并为通用函数减少重复。
修正后的完整代码
from datetime import datetime from typing import List def load_data(file_name: str) -> List[List[str]]: data = [] with open(file_name, 'r', newline='') as input_file: for line in input_file: # 去除换行符并分割字段 cleaned_line = line.strip('\r\n') fields = cleaned_line.split(';') data.append(fields) return data def merge_and_sort(list1: List[List[str]], list2: List[List[str]]) -> List[List[str]]: # 直接合并两个列表,无需循环逐个添加 merged_list = list1 + list2 # 按日期排序:将字符串日期转为datetime对象作为排序依据 sorted_list = sorted(merged_list, key=lambda x: datetime.strptime(x[0], '%Y-%m-%d')) return sorted_list def format_output(sorted_data: List[List[str]]) -> None: # 转换为期望的字符串格式并打印 formatted = [';'.join(item) for item in sorted_data] print('[', ',\n '.join(formatted), ']', sep='') # 执行流程 bitcoin_data = load_data("bitcoin.txt") exchange_data = load_data("exchange.txt") sorted_result = merge_and_sort(bitcoin_data, exchange_data) format_output(sorted_result)
关键知识点说明
1. 日期排序的核心逻辑
字符串日期直接排序会按字符顺序(比如"2022-08-10"会错误排在"2022-08-2"前面),必须转为datetime对象才能正确识别日期先后。
lambda x: datetime.strptime(x[0], '%Y-%m-%d')的含义:
lambda x:代表排序时的每个元素(即单条记录的子列表)x[0]:取子列表的第一个元素(日期字符串)datetime.strptime(x[0], '%Y-%m-%d'):将字符串按年-月-日格式解析为datetime对象,作为排序依据
2. 列表合并的简化写法
Python中两个列表直接用+运算符即可合并,无需循环逐个添加,比如list1 + list2会直接生成包含两个列表所有元素的新列表。
3. 代码复用
将重复的文件读取逻辑封装为load_data函数,后续新增数据源时只需调用该函数,避免代码冗余。
运行结果
执行后会输出你期望的格式:
[2022-08-01;buy;100, 2022-08-02;buy;200, 2022-08-03;sell;300, 2022-08-04;buy;50, 2022-08-05;sell;25, 2022-08-06;buy;10]
内容的提问来源于stack exchange,提问作者pedroo_
相关产品推荐
相关产品推荐

