如何检查待办列表中是否存在指定任务名(列表元素为元组)
修复Python待办列表的任务名重复判断问题
问题根源
原代码中if name in ToDoList的逻辑无效,因为ToDoList的元素是(name, date)格式的元组,直接判断字符串name是否在列表里,本质是检查是否有元组等于这个字符串,显然永远不会成立。
解决方案
要判断任务名是否重复,需要遍历列表中的每个元组,提取元组的第一个元素(即任务名)进行对比。可以用any()函数简洁实现这个检查:
any(task[0] == name for task in ToDoList)
同时注意代码里的另一个错误:ToDoList = ToDoList.append(task)这行是错误的,因为list.append()是原地修改列表,返回值为None,这样会把ToDoList覆盖成None,后续调用sort()会抛出异常,应该直接调用ToDoList.append(task)。
修改后的完整代码
from datetime import datetime ToDoList = [] date_format = "%Y/%m/%d %H:%M:%S" def addNewItems(): global ToDoList # 获取当前时间,放在循环内确保每次添加任务时的时间都是最新的 current_time = datetime.now() while True: name = input("Please enter your task name: ") # 检查任务名是否已存在 if any(task[0] == name for task in ToDoList): print("Task already exists! Select the options again.") else: break while True: date_input = input("Please enter your task completion date as yyyy/mm/dd HH:MM:SS: ") try: date = datetime.strptime(date_input, date_format) if date < current_time: print("Time entered is in the past! Select the options again") else: break except ValueError: print("Invalid date format! Please follow yyyy/mm/dd HH:MM:SS.") task = (name, date) ToDoList.append(task) # 按任务截止日期排序 ToDoList.sort(key=lambda x: x[1]) print("Task added successfully!")
额外优化说明
- 把
current_time的获取放到函数内循环前,确保每次添加任务时的当前时间是最新的,避免程序运行很久后时间判断失效。 - 给日期输入添加了
try-except捕获格式错误,避免用户输入不符合要求的日期时程序崩溃。 - 排序时指定
key=lambda x: x[1],按任务的截止日期排序,比默认的元组排序(先按任务名字母序,再按日期)更符合待办列表的需求。
内容的提问来源于stack exchange,提问作者user20006707
相关产品推荐
相关产品推荐

