搜索字典列表以查看任何字典中是否存在键/值

时间:2014-07-06 16:31:17

标签: python list search dictionary

所以我有一个词典列表, 例如:

[{'title':'Green eggs and ham', 'author':'dr seuss'}, {'title':'matilda', 'author':'roald dahl'}]

搜索malcolm gladwell中的异常值是否存在于这些词典中的最佳方法是什么?

我在想蛮力检查每个标题和作者,但我觉得必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

如果您需要匹配所有键值对,您只需使用in并让列表搜索您:

if {'title': 'outliers', 'author': 'malcolm gladwell'} in yourlist:

否则,如果没有其他索引,则必须“手动”搜索列表。您可以将any function与生成器表达式一起使用以使测试有效足够(例如,在找到匹配项时停止搜索),再加上dictionary view objects来测试密钥的子集 - 价值对:

search = {'title': 'outliers', 'author': 'malcolm gladwell'}.viewitems()
if any(search <= d.viewitems() for d in yourlist):
即使yourlist中的字词包含的密钥多于titleauthor

也会匹配。

您可以使用额外的索引来避免完全扫描:

authors = {}
titles = {}
for d in yourlist:
    authors.set_default(d['author'], []).append(d)
    titles.set_default(d['title'], []).append(d)

通过词典中的特定键创建额外的映射。不,你可以测试单个元素:

if any(d['title'] == 'outliers' for d in authors.get('malcolm gladwell', [])):

只是通过Malcolm Gladwell的所有书籍进行有限的搜索。

titlesauthors词典将作者和标题字符串映射到相同词典的列表,与yourlist列表共享。但是,在一个这样的结构中添加或删除字典确实需要更新所有结构。这是关系数据库派上用场的地方,因为它非常适合为您保留这些索引,并会自动保持这些最新。