python - 如何从键值匹配中找到键值?
问题描述
我有一个非常长的有序字典,看起来类似于:
OrderedDict([('JIRAUSER16100', {'name': 'john.smith', 'fullname': 'John Smith', 'email': 'John.Smith@domain.test', 'active': True}), ('JIRAUSER16300', {'name': 'susan.jones', 'fullname': 'Susan Jones', 'email': 'Susan.Jones@domain.test', 'active': True})])
如何搜索此列表以根据键值匹配查找键值?例如,对于 Susan Jones,我想根据姓名值查找她的电子邮件?有没有一种 Pythonic 的方法可以找到它,而无需遍历整个字典?
目前我只是在下面这样做,但是当我必须浏览列表一千次时,它似乎效率低下。我很好奇是否有某种“查找”方法?
searchname = "susan.jones"
for user in my_ordered_dict.items():
if user[1]["name"] == searchname:
print(user[1]["email"])
解决方案
您可以通过两种方式来改进这一点。你说你OrderedDict
真的很长,所以我推荐第一个选项,因为随着数据大小的增长,它很快就会比第二个更快。
1)使用熊猫:
In [1]: from collections import OrderedDict
In [2]: import pandas as pd
In [3]: d = OrderedDict([
...: ('JIRAUSER16100', {'name': 'john.smith',
...: 'fullname': 'John Smith',
...: 'email': 'John.Smith@domain.test',
...: 'active': True}),
...: ('JIRAUSER16300', {'name': 'susan.jones',
...: 'fullname': 'Susan Jones',
...: 'email': 'Susan.Jones@domain.test',
...: 'active': True})
...: ])
In [4]: df = pd.DataFrame(d).T
In [5]: df
Out[5]:
name fullname email active
JIRAUSER16100 john.smith John Smith John.Smith@domain.test True
JIRAUSER16300 susan.jones Susan Jones Susan.Jones@domain.test True
In [6]: df.loc[df['name'] == 'susan.jones', 'email'][0]
Out[6]: 'Susan.Jones@domain.test'
在易学但弱到难学但功能强大的规模上,pandas
离后一个极端还很远。如果你不熟悉的话,这里有很多可以解压的东西pandas
,所以为了简洁起见,我不会深入探讨。但是,如果更多解释会有所帮助,请随时对任何问题发表评论。
2)使用内置next
函数
这将允许您避免遍历整个字典。长话短说,您可以传递next
一个带有三元表达式的生成器,它本质上将运行一个可迭代对象,直到找到满足给定条件的第一个项目。所以在你的情况下,
In [7]: next(entry['email'] for entry in d.values() if entry['name'] == 'susan.jones')
Out[7]: 'Susan.Jones@domain.test'
会工作。它将节省您遍历整个字典的时间,但与选项 1 不同的是,它的速度将取决于OrderedDict
您要查找的条目中的位置。除非您出于某种原因需要专门使用标准库,否则 Pandas 在任何合理大小的数据集上都会快得多。
希望这可以帮助!
推荐阅读
- c# - 如何使通用列表作为 IEnumerable 传递和返回
返回一个正确的值而不是 null? - django - 在 quizgame django API 中获取随机问题
- ionic-framework - FileTransfer 下载返回所有属性为空的错误
- rest - API 适用于 Postman,但不适用于 Axios
- sql - 按日期字段从表中获取用户
- c - 我如何找到给定程序的中位数
- python - 每次测试后烧瓶单元测试不关闭端口
- c# - Selenium C# 文件上传不适用于 JavaScript Executor 和 SendKeys
- html - 反应路由器链接包装div背景不显示
- javascript - 如何在浏览器中运行 TypeScript 编译后的 JS 文件?