Python 筛选字典列表

Python 筛选字典列表,python,list,dictionary,Python,List,Dictionary,我有一份一模一样的字典的清单 list_dict = [{'id': 1}, {'id': 2}, {'id': 3}] 现在我想过滤一个id值为id的特定字典,比如id=2 我知道 上面的解决方案是有效的,但是如果我有一个很长的列表,那么遍历整个列表并检查id是否匹配将是低效的。还有其他解决方法吗?将其作为生成器表达式,并一次获得一个匹配项,如下所示 matcher = (d for d in list_dict if d['id'] == 2) print next(matcher, No

我有一份一模一样的字典的清单

list_dict = [{'id': 1}, {'id': 2}, {'id': 3}]
现在我想过滤一个id值为id的特定字典,比如id=2

我知道


上面的解决方案是有效的,但是如果我有一个很长的列表,那么遍历整个列表并检查id是否匹配将是低效的。还有其他解决方法吗?

将其作为生成器表达式,并一次获得一个匹配项,如下所示

matcher = (d for d in list_dict if d['id'] == 2)
print next(matcher, None)
在同一生成器对象上调用
next
时,它将从上次离开的位置恢复循环

print next(matcher, None)

next
的第二个参数是生成器表达式用尽时返回的默认值。

Python提供了一个函数过滤器:

filter(lambda x: x["id"]==2,list_dict)
您也可以使用
itertools
软件包提供的迭代器:

itertools.ifilter(lambda x: x["id"] ==2, list_dict)
ifilter
将逐个元素应用传递的函数

如果希望迭代在第一次匹配时停止,可以尝试以下方法:

itertools.dropwhile(lambda x: x["id"] !=2, list_dict).next()

你没有正确理解这个问题。如果列表包含大量数据,则此解决方案效率低下dictionaries@user3214779正如前面所写的问题,这是一个很好的答案,你问了一个很长的列表,生成器是一个很好的方法,用于大型或无限的列表,在所有其他情况下(速度限制)列表理解就可以了。要理解,您可以阅读@KobiK,请查看for循环在列表上迭代的次数,这将花费大量时间。@user3214779如果要检查匹配项,您必须“迭代”,区别在于运行时是否要将列表保存在内存中,如果列表很长,这不是一个好方法。如果你想节省迭代时间,你可以把它放入排序的列表中,然后你可以在匹配查找中节省大量时间。嗯,我说的是问题中写的长列表。你应该使用numpy arrayA不同的数据结构吗?为什么键入id的是词典列表而不是词典词典(如果id不唯一,则键入词典列表的词典)?
itertools.dropwhile(lambda x: x["id"] !=2, list_dict).next()