在词典列表中找到一个项目

Mor*_*mir 3 python dictionary list

说我有一个字典清单。列表中的每个字典都有3个元素。名称,ID和状态。

list_of_dicts = [{'id':1, 'name':'Alice', 'status':0},{'id':2, 'name':'Bob', 'status':0},{'id':3, 'name':'Robert', 'status':1}]
Run Code Online (Sandbox Code Playgroud)

所以我得到:

In[20]: print list_of_dicts
Out[20]: 
[{'id': 1, 'name': 'Alice', 'status': 0},
 {'id': 2, 'name': 'Bob', 'status': 0},
 {'id': 3, 'name': 'Robert', 'status': 1}]
Run Code Online (Sandbox Code Playgroud)

如果我收到名字,如何在不迭代列表的情况下获取其状态?
例如,我得到“罗伯特”,我想输出1.
谢谢。

Roa*_*ner 5

没有迭代就不可能做到这一点。

但是,您可以将字典转换为不同的数据结构,例如名称为键的字典:

new_dict = {person["name"]: {k: v for k, v in person.items() if k != "name"} for person in list_of_dicts}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样获取状态:

new_dict["Robert"]["status"]
# 1
Run Code Online (Sandbox Code Playgroud)

此外,正如@tobias_k在评论中提到的,您可以保持内部字典相同:

{person["name"]: person for person in list_of_dicts}
Run Code Online (Sandbox Code Playgroud)

上述方法的唯一问题是它无法处理多个名称。您可以将唯一的 id 添加到键中以区分名称:

new_dict = {(person["name"], person["id"]): person["status"] for person in list_of_dicts}
Run Code Online (Sandbox Code Playgroud)

可以这样调用:

new_dict["Robert", 3]
# 1
Run Code Online (Sandbox Code Playgroud)

尽管创建这些数据结构需要额外的计算(仅一次),但之后的查找将是 O(1),而不是每次要搜索名称时都迭代列表。


fra*_*own 5

例如你可以用熊猫

import pandas as pd
list_of_dicts = [{'id':1, 'name':'Alice', 'status':0},{'id':2, 'name':'Bob', 'status':0},{'id':3, 'name':'Robert', 'status':1}]

a = pd.DataFrame(list_of_dicts)
a.loc[a['name'] == 'Robert']
Run Code Online (Sandbox Code Playgroud)

并非常快速地使用数据帧,因为在c ++上编写且简单(例如sql查询)


pro*_*ico 3

正如您发现必须迭代(除非您能够将数据结构更改为封闭的字典)为什么不这样做呢?

>>> [d['status'] for d in list_of_dicts if d['name']=='Robert']
[1]
Run Code Online (Sandbox Code Playgroud)

尽管如此,我建议每次您在建议的数据结构中看到某些“id”字段时都考虑使用映射类型(例如字典)。如果它在那里,您可能想用它进行一般识别,而不是随身携带字典。它们也可以用于关系,并且如果您以后需要的话可以轻松地转移到关系数据库中。