0

我有一个字典列表。看起来像,

abc = [{"name":"bob",
        "age": 33},
       {"name":"fred",
        "age": 18},
       {"name":"mary",
        "age": 64}]

可以说我想查找鲍勃的年龄。我知道我可以运行一个 for 循环等。但是我的问题是有没有更快的方法来做到这一点。一种想法是使用循环,但一旦完成查找(在本例中为 bob 的年龄),就退出循环。

这个问题的原因是我的数据集有数千行,所以我正在寻找我可以获得的任何性能提升。

编辑:我可以看到您可以通过使用生成器来使用以下内容,但是我不太确定这是否仍会迭代列表的所有项目,或者只是迭代直到找到包含名称 bob 的第一个字典?

next(item for item in abc if item["name"] == "bob")

谢谢,

4

5 回答 5

7

根据您想要执行此操作的次数,可能值得定义一个字典,将名称映射到相应的年龄(或者如果两个以上的人可以共享相同的姓名,则为相应的年龄列表)。

字典理解可以帮助您:

abc_dict = {x["name"]:x["age"] for x in abc}
于 2013-08-30T21:12:33.083 回答
4

我会考虑制作另一本字典,然后将其用于多个年龄查找:

for person in abc:
    age_by_name[person['name']] = person['age']

age_by_name['bob']
# this is a quick lookup!

编辑:这相当于 Josay 的回答中列出的 dict 理解

于 2013-08-30T21:12:39.393 回答
1

尝试先索引它(一次),然后使用索引(多次)。

你可以索引它,例如。通过使用dict(键是您要搜索的内容,而值是您要搜索的内容),或者将数据放入数据库中。如果您确实有更多查找并且很少需要修改数据,那应该涵盖这种情况。

于 2013-08-30T21:12:11.370 回答
1

只定义这样的字典字典

peoples = {"bob":{"name":"bob","age": 33},
"fred":{"name":"fred","age": 18},
"mary": {"name":",mary","age": 64}}
person = peoples["bob"]
persons_age = person["age"] 

查找“鲍勃”,然后查找“年龄”

这是正确的,不是吗?

于 2013-08-30T22:10:54.083 回答
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))
于 2013-08-30T21:18:46.733 回答