使用Python列表推导式处理字典列表后出现重复项问题
解决列表推导式重复项问题
你的列表推导式使用了双重循环,遍历l1的每个元素时又遍历l2的所有元素,导致每个l1元素会生成len(l2)个条目——其中只有一次是匹配ticket_type后修改的结果,其余都是原元素的副本,最终出现重复。
最优解决方案
先将l2转换为以ticket_type为键的字典,这样可以快速查找对应预订量,再通过单次遍历l1生成结果,既避免重复又提升效率:
# 把l2转成字典,便于快速查找预订量 booked_dict = {item["ticket_type"]: item["ticket_booked"] for item in l2} # 列表推导式生成最终结果 result = [ {**x, "ticket_count": x["ticket_count"] - booked_dict[x["ticket_type"]]} for x in l1 ]
运行后输出的result与期望一致:
[{'ticket_type': 'A1', 'ticket_count': 28, 'ticket_price': 1000.0}, {'ticket_type': 'A2', 'ticket_count': 68, 'ticket_price': 500.0}, {'ticket_type': 'A3', 'ticket_count': 3, 'ticket_price': 1200.0}]
备选方案(不提前转字典)
如果不想提前生成字典,也可以用生成器表达式匹配对应ticket_type的预订量,但这种方式时间复杂度更高(每个l1元素都要遍历一次l2):
result = [ {**x, "ticket_count": x["ticket_count"] - next(y["ticket_booked"] for y in l2 if y["ticket_type"] == x["ticket_type"])} for x in l1 ]
内容的提问来源于stack exchange,提问作者Animeartist
相关产品推荐
相关产品推荐

