首页 > 解决方案 > 如何从键值匹配中找到键值?

问题描述

我有一个非常长的有序字典,看起来类似于:

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"])

标签: pythondictionaryordereddictionary

解决方案


您可以通过两种方式来改进这一点。你说你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 在任何合理大小的数据集上都会快得多。

希望这可以帮助!


推荐阅读