Python字典中访问同级字典值的最有效方法是什么?

5
在Python中,我有一个字典列表,格式如下:
matchings = [
    {'id': 'someid1', 'domain': 'somedomain1.com'},
    {'id': 'someid2', 'domain': 'somedomain2.com'},
    {'id': 'someid3', 'domain': 'somedomain3.com'}
]

而且,我有一个变量:

the_id = 'someid3'

什么是获取项目域值的最有效方法?
5个回答

7

您可以使用一个列表推导式

domains = [matching['domain'] for matching in matchings if matching['id'] == the_id]

这遵循标准格式:

resulting_list = [item_to_return for item in items if condition]

基本上,它封装了以下所有功能:

domains = []
for matching in matchings:
    if matching['id'] == the_id:
        domains.append(matching['domain'])

所有这些功能都可以使用列表推导式表示为单行代码。

它可能是完美的,但它是否高效?匹配的长度是多少?也看看S.Lott的答案。 - tzot
使用如此长的名称有什么原因吗?[m['domain'] for m in matchings if m['id'] == the_id] - jfs
1
我怀疑“效率”这个要求更多的是为了找到一种漂亮、干净的解决方法。 - Soviut
是的,具体来说,这段代码将在ZPT中使用,在那里我没有访问典型的Python环境,并且非常受限制。从这个意义上说,它完美地运行。 - Nick Sergeant
如果我在我正在工作的代码中遇到了列表推导式,我会想几分钟“这是什么鬼”?下面的代码更易读... - boatcoder
1
@Mark0978,这是相当主观的,因为列表推导式在Python中已经存在很长时间,有很好的文档支持,并且被广泛使用。它们不是“聪明的编码”,只是一种简化使用“for循环和if语句”组合构建列表的常见任务的方法。我猜你可能没有多少使用它们,否则你会发现它们阅读起来同样容易,甚至更容易。 - Soviut

2
我会重新构建matchings
from collections import defaultdict
matchings_ix= defaultdict(list)
for m in matchings:
    matchings_ix[m['id']].append( m )

现在最高效的查找方法是

matchings_ix[ d ]

1

我能想到的最好方法就是进行显式搜索。这是我对Python感到失望的一个领域,因为它没有像C++ STL算法那样给你一个强大的解耦构建块集合。

[d["domain"] for d in matchings if d["id"] == "someid3"]

我得到了这个输出:[somedomain3.com],如果我想要这个输出,没有括号somedomain3.com,你可以使用[d["domain"] for d in matchings if d["id"] == "someid3"][0] - Stephan Kristyn

0

我非常喜欢在这种情况下使用filter。它接受一个函数和一个可迭代对象,并返回函数返回True的元素列表(在Python 3.x中,它返回一个迭代器)。

>>> filter(lambda x: x['id'] == 'someid3', matchings)
<<< [{'domain': 'somedomain3.com', 'id': 'someid3'}]

你可以使用列表推导式获取所有域名的列表:

>>> [x['domain'] for x in filter(lambda x: x['id'] == 'someid3', matchings)]
<<< ['somedomain3.com']

0
事实上,列表中有字典并不重要——问题归结为在列表中查找某个属性为真的项。为此,@Soviut答案的某些变体是正确的方法:循环或列表推导,在检查每个项直到找到匹配项。没有固有的项目排序,因此您甚至不能依赖像bisect这样有用的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接