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

时间:2018-12-18 15:30:28

标签: python list dictionary

说我有一个字典列表。 列表中的每个字典都有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。
谢谢。

5 个答案:

答案 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