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.
谢谢。
没有迭代就不可能做到这一点。
但是,您可以将字典转换为不同的数据结构,例如名称为键的字典:
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),而不是每次要搜索名称时都迭代列表。
例如你可以用熊猫
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查询)
正如您发现必须迭代(除非您能够将数据结构更改为封闭的字典)为什么不这样做呢?
>>> [d['status'] for d in list_of_dicts if d['name']=='Robert']
[1]
Run Code Online (Sandbox Code Playgroud)
尽管如此,我建议每次您在建议的数据结构中看到某些“id”字段时都考虑使用映射类型(例如字典)。如果它在那里,您可能想用它进行一般识别,而不是随身携带字典。它们也可以用于关系,并且如果您以后需要的话可以轻松地转移到关系数据库中。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |