我有一个词典列表。看起来像,
abc = [{"name":"bob",
"age": 33},
{"name":"fred",
"age": 18},
{"name":"mary",
"age": 64}]
让我说我想查找bobs年龄。我知道我可以运行for循环等等。但是我的问题是有没有更快的方法来做到这一点。 一种想法是使用一个循环但是一旦查找(在这种情况下为bob的年龄)已经完成就会中断循环。
这个问题的原因是我的数据集长达数千行,所以我正在寻找可以获得的任何性能提升。
编辑:我可以看到你可以通过使用生成器来使用以下内容,但我不太确定这是否仍会迭代列表中的所有项目或只是迭代直到找到包含名称bob的第一个dict ?
next(item for item in abc if item["name"] == "bob")
谢谢,
答案 0 :(得分:7)
根据您要执行此操作的次数,可能值得定义字典映射名称到相应的年龄(或者如果两个以上的人可以共享相同的名称,则列出相应的年龄)。
词典理解可以帮助你:
abc_dict = {x["name"]:x["age"] for x in abc}
答案 1 :(得分:4)
我考虑制作另一本字典,然后将其用于多年龄查询:
for person in abc:
age_by_name[person['name']] = person['age']
age_by_name['bob']
# this is a quick lookup!
编辑:这相当于Josay的答案中列出的字典理解
答案 2 :(得分:1)
首先尝试索引(一次),然后使用索引(多次)。
你可以索引它,例如。通过使用dict
(键将是您搜索的内容,而值将是您要搜索的内容),或者将数据放入数据库中。如果您真的有更多的查找并且很少需要修改数据,那么应该涵盖这种情况。
答案 3 :(得分:1)
仅限于这样的字典字典
peoples = {"bob":{"name":"bob","age": 33},
"fred":{"name":"fred","age": 18},
"mary": {"name":",mary","age": 64}}
person = peoples["bob"]
persons_age = person["age"]
查找“bob”然后查找“年龄”
这是正确的吗?
答案 4 :(得分:0)
您可以编写辅助函数。这是一个需要。
import itertools
# First returns the first element encountered in an iterable which
# matches the predicate.
#
# If the element is never found, StopIteration is raised.
# Args:
# pred The predicate which determines a matching element.
#
first = lambda pred, seq: next(itertools.dropwhile(lambda x: not pred(x), seq))