Python生成ID编号时无法获取最后三位数字的技术求助
问题:无法正确生成ID编号的最后三位数字
我无法获取ID编号的最后三位数字,当前代码运行后存在数据匹配错误的问题:
from datetime import datetime def days_to_birthday(date): datetime_object = datetime.strptime(date, "%Y-%m-%d") date = datetime_object.date() num_days = date.timetuple().tm_yday return num_days fo = open("Data.txt", 'r') # 存储数据的文件 content = [i.rsplit() for i in fo.readlines()] names = [content[i][0] for i in range(len(content))] dates = [content[i][1] for i in range(len(content))] gender = [content[i][2] for i in range(len(content))] id_numbers = [] mydict = dict(zip(dates, gender)) for i in mydict: x = days_to_birthday(i) if mydict.get(i) == "F":x += 500 x = str(x) if len(x) < 3:x = x.zfill(3) i = i.split('-') out = i[0] + x id_numbers.append(out) for i in range(len(names)): print(f"{names[i]} {id_numbers[i]}" )
问题原因
- 数据丢失:使用
dict(zip(dates, gender))会丢弃重复日期对应的性别数据——字典的键唯一,重复日期会被后续条目覆盖,导致id_numbers的长度小于names的长度,运行时会触发索引错误。 - 顺序混乱:字典遍历的顺序无法保证和原始数据一致,最终会出现姓名与ID不匹配的情况。
修正后的代码
from datetime import datetime def days_to_birthday(date): datetime_object = datetime.strptime(date, "%Y-%m-%d") date = datetime_object.date() num_days = date.timetuple().tm_yday return num_days # 用with语句自动管理文件资源 with open("Data.txt", 'r') as fo: content = [line.strip().split() for line in fo.readlines()] id_numbers = [] # 直接遍历每条原始数据,确保无丢失、顺序一致 for name, date, gender in content: day_of_year = days_to_birthday(date) if gender == "F": day_of_year += 500 # 统一格式化为三位数字,不足补零 last_three = str(day_of_year).zfill(3) year = date.split('-')[0] id_num = f"{year}{last_three}" id_numbers.append(id_num) # 配对输出姓名与ID for name, id_num in zip([item[0] for item in content], id_numbers): print(f"{name} {id_num}")
修正说明
- 改用
with语句操作文件,无需手动关闭,更安全规范。 - 直接遍历原始数据列表,保留所有条目且顺序与输入一致,避免数据丢失和匹配错误。
- 简化变量逻辑,直接解包每条数据的姓名、日期、性别,代码可读性更强。
- 用
str.zfill(3)统一处理三位数字格式,替代手动判断长度的冗余代码。
内容的提问来源于stack exchange,提问作者Chamika Jayasinghe
相关产品推荐
相关产品推荐

