Python如何根据字典内嵌套列表内容正确过滤字典列表
错误原因
你编写的嵌套filter语句没有生效,是因为内层filter返回的是迭代器对象,在Python中哪怕是空迭代器的布尔判定结果也为True,因此外层filter会保留所有字典元素,最终输出原列表。
实现方案
方案1:列表推导 + any()(最推荐)
any()函数只要检测到迭代器中存在任意一个True值就会立即返回True,刚好匹配你“至少包含一个可接受水果”的过滤规则,且匹配到第一个符合条件的元素就会终止遍历,性能更优:
list_of_dicts = [ {'id': 1, 'fruits':['apple']}, {'id': 2, 'fruits':['orange']}, {'id': 3, 'fruits':['banana', 'apple']}, {'id': 4, 'fruits':['banana', 'apple', 'orange']} ] acceptable_fruits = ['apple', 'banana'] filtered_list = [d for d in list_of_dicts if any(fruit in acceptable_fruits for fruit in d['fruits'])] print(filtered_list)
输出结果和你给出的预期结果完全一致。
方案2:基于filter的实现
如果偏好使用filter写法,只需将内层判断替换为any()逻辑即可:
filtered_list = filter(lambda d: any(fruit in acceptable_fruits for fruit in d['fruits']), list_of_dicts) print(list(filtered_list))
性能优化建议
如果可接受水果列表较长,可以先将其转换为集合,将in操作的时间复杂度从O(n)降低到O(1):
acceptable_set = set(acceptable_fruits) filtered_list = [d for d in list_of_dicts if any(fruit in acceptable_set for fruit in d['fruits'])]
内容的提问来源于stack exchange,提问作者ismaupin
相关产品推荐
相关产品推荐

