在一个操作中用于多个字典查找的语法糖

时间:2013-11-12 18:36:26

标签: python dictionary

说我有一本字典如下:

example_dict = {"foo": 1, "bar": 2}

我想在语义上进行多次查找:

foo = example_dict["foo"]
bar = example_dict["bar"]

有没有办法一次进行多次查找?我最接近的是使用列表推导或生成器表达式,如:

foo, bar = [example_dict[key] for key in ["foo", "bar"]]
foo, bar = (example_dict[key] for key in ["foo", "bar"])

理想情况下,我想做的是:

foo, bar = example_dict.getmany(["foo", "bar"])

甚至:

foo, bar = example_dict["foo", "bar"]

与您对列表或元组的处理方式类似:

foo, bar = "foo", "bar"

显然,我可以通过返回上面的列表推导或生成器表达式来定义我自己的函数。或者我可以创建自己的字典类,如果给定一个可迭代的查找,则按键查找并返回一个可迭代的字典类。在其他数据结构(即不是散列)中,一次查找几个键感觉它理论上可以提供比许多单独查找更好的性能。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

你可以使用地图,我想,虽然我不确定它真的更容易:

In [112]: example_dict = {"foo": 1, "bar": 2}
In [113]: map(example_dict.__getitem__, ['foo', 'bar'])
[0x1,
 0x2]

然而,理论上甚至没有任何方法可以从中获得加速...每次查找已经或多或少是恒定时间(这是一个哈希查找)所以没有真正的机会来整理查找以获得任何加速。 ...

答案 1 :(得分:0)

这个问题听起来像是来自一个过早优化的地方,但为了这个答案我会认为过早的不是真的。

简短的回答是,没有办法用库存Python词典做到这一点。更长的答案是,如果存在常见的查找模式,则可以利用这些模式来限制查找次数。例如,如果你总是查找“foo”然后“bar”,你可以改为使用复合键 - 也许是元组(“foo”,“bar”) - 并将值存储在元组中。

存储值的代码看起来像

d["foo", "bar"] = (42, 47)

检索值的代码将是

foo_value, bar_value = d["foo", "bar"]