所以我有一个词典列表, 例如:
[{'title':'Green eggs and ham', 'author':'dr seuss'}, {'title':'matilda', 'author':'roald dahl'}]
搜索malcolm gladwell中的异常值是否存在于这些词典中的最佳方法是什么?
我在想蛮力检查每个标题和作者,但我觉得必须有更好的方法。
答案 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
中的字词包含的密钥多于title
和author
,也会匹配。
您可以使用额外的索引来避免完全扫描:
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的所有书籍进行有限的搜索。
titles
和authors
词典将作者和标题字符串映射到相同词典的列表,与yourlist
列表共享。但是,在一个这样的结构中添加或删除字典确实需要更新所有结构。这是关系数据库派上用场的地方,因为它非常适合为您保留这些索引,并会自动保持这些最新。