Python中基于不同字段求字典列表差值的优雅实现方法
当然可以实现!而且确实有比多层循环更优雅的写法,我给你几种实用方案参考:
方案一:列表推导式 + 集合(最推荐,高效又易读)
先把second列表里的user_id提取成集合(集合的成员查找是O(1),比列表快得多,尤其是数据量大的时候),再用列表推导式过滤first:
first = [{'id': '1'}, {'id': '2'}, {'id': '3'}] second = [{'user_id': '1'}, {'user_id': '2'}] # 提取second中的user_id到集合 second_user_ids = {item['user_id'] for item in second} # 过滤出first中id不在集合里的项 result = [item for item in first if item['id'] not in second_user_ids] print(result) # 输出: [{'id': '3'}]
方案二:filter + lambda(满足你想要的lambda写法)
如果偏爱用高阶函数,也可以结合filter和lambda来实现,逻辑和上面一致:
second_user_ids = {item['user_id'] for item in second} result = list(filter(lambda x: x['id'] not in second_user_ids, first))
为什么不推荐多层循环?
多层循环的时间复杂度是O(n*m)(n是first的长度,m是second的长度),而用集合的方法是O(n+m),数据量越大,效率差距越明显。而且上面两种写法的可读性也比嵌套循环好太多。
小提示:如果你的字典可能存在缺少id或user_id的情况,可以用item.get('id')代替item['id'],避免抛出KeyError。
内容的提问来源于stack exchange,提问作者Mr.D
相关产品推荐
相关产品推荐

