简洁的Python 3.x批量字典查询

3

我有很多字符串需要转换成整数。在Python 3.7中,最简洁的方法是什么,可以对列表执行字典查找操作?

例如:

d = {'frog':1, 'dog':2, 'mouse':3}
x = ['frog', 'frog', 'mouse']
result1 = d[x[0]]
result2 = d[x]

result 的值为 1,但不可能存在 result2

TypeError                                 Traceback (most recent call last)
<ipython-input-124-b49b78bd4841> in <module>
      2 x = ['frog', 'frog', 'mouse']
      3 result1 = d[x[0]]
----> 4 result2 = d[x]

TypeError: unhashable type: 'list'

这可以通过以下方式实现:
result2 = []
for s in x:
    result2.append(d[s])

这会得到[1, 1, 3]的结果,但需要使用循环。对于大型列表来说,这是否是最优解呢?


你对 result2 期望得到什么结果?不清楚输出应该是什么。你有阅读其他提到这个错误的帖子吗? - jonrsharpe
1
你是不是指像 [d[k] for k in x] 这样的东西? - iz_
@jonrsharpe 结果应该是 [1, 1, 3]。编辑以提供可能的结果。 - Steve
@Tomothy32 是的。这是否相当于示例,或者说由于您的迭代器可以预先确定大小,应该期望性能提升? - Steve
1
@Steve 一般来说,列表推导式比for循环更快。另一个选项是list(map(d.get, x))。你应该自己尝试每个解决方案,看看哪个最好。从我尝试过的情况来看,itemgetter是最快的。 - iz_
显示剩余2条评论
2个回答

9
字典的键必须是可哈希的,而列表(例如x)就不是可哈希的,因此当您尝试将x用作索引字典d的键时会导致TypeError: unhashable type: 'list'错误。如果您想进行大量字典查找,可以使用operator.itemgetter方法代替:
from operator import itemgetter
itemgetter(*x)(d)

这段代码的作用是返回以下结果:
(1, 1, 3)

4
如果您正在使用默认的Python,则可以使用列表推导式:
result = [d[i] for i in x]

如果您可以接受使用 numpy 解决方案,您可以使用条件替换。这可能在大量输入时是最快的:

import numpy as np

result = np.array(x)
for k, v in d.items(): result[result==k] = v

最终,pandas有了一个.replace的函数。

import pandas as pd

result = pd.Series(x).replace(d) 

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