如何在列表中保留顺序?照片重命名后输出顺序与原字符串不一致的技术咨询
解决照片重命名后保持原输入顺序的问题
你的问题核心在于当前代码是按城市分组后批量输出所有该城市的重命名照片,而不是按照原始输入中照片的出现顺序逐个输出对应的新名称。要解决这个问题,我们需要先为每个照片建立“原始照片→新名称”的映射,最后再按照原始顺序遍历生成结果。
修改后的代码
def fetch_date_time(photo): return photo.split(", ")[2] def prefixed_number(n, max_n): len_n = len(str(n)) len_max_n = len(str(max_n)) # 简化前导零生成逻辑 prefix = "0" * (len_max_n - len_n) + str(n) return prefix def solution(S): list_of_pics = S.split("\n") city_dict = {} # 1. 按城市分组所有照片 for pic in list_of_pics: city = pic.split(", ")[1] if city not in city_dict: city_dict[city] = [] city_dict[city].append(pic) # 2. 为每个照片建立原始字符串到新名称的映射 photo_to_new_name = {} for city, photos in city_dict.items(): # 按拍摄时间对当前城市的照片排序 sorted_photos = sorted(photos, key=fetch_date_time) total_photos = len(sorted_photos) # 为排序后的每个照片生成新名称并存入映射 for idx, photo in enumerate(sorted_photos, start=1): file_ext = photo.split(", ")[0].split(".")[-1] padded_num = prefixed_number(idx, total_photos) new_name = f"{city}{padded_num}.{file_ext}" photo_to_new_name[photo] = new_name # 3. 严格按照原始输入顺序拼接新名称 final_string = "\n".join([photo_to_new_name[pic] for pic in list_of_pics]) return final_string # 测试用例 string = """photo.jpg, Warsaw, 2013-09-05 14:08:15 john.png, London, 2015-06-20 15:13:22 myFriends.png, Warsaw, 2013-09-05 14:07:13 Eiffel.jpg, Paris, 2015-07-23 08:03:02 pisatower.jpg, Paris, 2015-07-22 23:59:59 BOB.jpg, London, 2015-08-05 00:02:03 notredame.png, Paris, 2015-09-01 12:00:00 me.jpg, Warsaw, 2013-09-06 15:40:22 a.png, Warsaw, 2016-02-13 13:33:50 b.jpg, Warsaw, 2016-01-02 15:12:22 c.jpg, Warsaw, 2016-01-02 14:34:30 d.jpg, Warsaw, 2016-01-02 15:15:01 e.png, Warsaw, 2016-01-02 09:49:09 f.png, Warsaw, 2016-01-02 10:55:32 g.jpg, Warsaw, 2016-02-29 22:13:11""" print(solution(string))
关键修改点说明
- 建立映射关系:不再直接拼接分组后的结果,而是先为每一张原始照片生成对应的新名称并存储在字典中,确保每个照片的新名称和原始内容一一对应。
- 按原始顺序输出:最后遍历原始的照片列表,从映射中取出对应新名称并拼接,完全保留输入时的照片顺序。
- 简化前导零生成:用字符串乘法
"0" * (len_max_n - len_n)替代原有的列表推导式,代码更简洁易读。
运行修改后的代码,输出顺序会完全匹配你期望的结果。
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

