说我有一个字典列表。 列表中的每个字典都有3个元素。 名称,ID和状态。
list_of_dicts = [{'id':1, 'name':'Alice', 'status':0},{'id':2, 'name':'Bob', 'status':0},{'id':3, 'name':'Robert', 'status':1}]
所以我得到了:
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}]
如果我收到一个名字,如何在不迭代列表的情况下获得它的状态?
例如我得到“罗伯特”,我想输出1。
谢谢。
答案 0 :(得分:4)
例如,您可以使用熊猫
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']
并非常快速地使用数据框,因为它是用c ++编写的并且很容易(例如sql查询)
答案 1 :(得分:3)
没有迭代就不可能做到这一点。
但是,但是您可以将字典转换为其他数据结构,例如以名称为键的字典:
new_dict = {person["name"]: {k: v for k, v in person.items() if k != "name"} for person in list_of_dicts}
然后您将获得如下状态:
new_dict["Robert"]["status"]
# 1
此外,正如@tobias_k在评论中提到的那样,您可以使内部字典保持相同:
{person["name"]: person for person in list_of_dicts}
上述方法的唯一问题是它不能处理多个名称。您可以改为在键中添加唯一ID,以区分名称:
new_dict = {(person["name"], person["id"]): person["status"] for person in list_of_dicts}
可以这样称呼:
new_dict["Robert", 3]
# 1
即使创建这些数据结构需要花费额外的计算(仅一次),但之后的查找仍将是O(1),而不是每次要搜索名称时都对列表进行迭代。
答案 2 :(得分:2)
我认为您不迭代字典就不会做您想做的事情:
最好的情况是,您会发现有人建议您隐藏迭代的方法。
如果真正关心的是速度,则可以在找到第一个有效结果后立即中断迭代:
for iteration, elements in enumerate(list_of_dicts):
if elements['name'] == "Robert":
print "Elements id: ", elements['id']
break
print "Iterations: ", iteration
# OUTPUT: Elements id: 3, Iterations: 1
请注意,迭代次数可能会有所不同,因为字典没有索引,并且如果您有更多"Roberts"
,则只会打印"id"
之一
答案 3 :(得分:2)
正如您发现的那样,您必须进行迭代(除非您能够将数据结构更改为封闭的字典),为什么不这样做呢?
>>> [d['status'] for d in list_of_dicts if d['name']=='Robert']
[1]
尽管如此,我建议您每次在建议的数据结构中看到某些“ id”字段时,都考虑使用一种映射类型(如dict)。如果有的话,您可能希望将其用于一般识别,而不是随身携带命令。它们也可以用于关系,如果以后需要,可以轻松地转移到关系数据库中。
答案 4 :(得分:1)
没有循环就无法访问您的list_of_dicts
,因此您可以根据自己的意愿对列表进行修改,例如 1 dict和许多列表 :< / p>
list_of_dicts_modified = {'name':['Alice', 'Bob', 'Robert'],'id':[1, 2, 3], 'status': [0, 0, 1]}
index = list_of_dicts_modified['name'].index(input().strip())
print('Name: {0} ID: {1} Status: {2}'.format(list_of_dicts_modified['name'][index], list_of_dicts_modified['id'][index], list_of_dicts_modified['status'][index]))
输出:
C:\Users\Documents>py test.py
Alice
Name: Alice ID: 1 Status: 0