【问题标题】:Concise Python 3.x Bulk Dictionary Lookup简洁的 Python 3.x 批量字典查找
【发布时间】:2019-02-10 22:30:30
【问题描述】:

我有大量的字符串要转换为整数。在 Python 3.7 中执行列表的字典查找最简洁的方法是什么?

例如:

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

result 等于 1result2 是不可能的:

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] 但需要一个 for 循环。这对于大型列表是否最佳?

【问题讨论】:

  • 您对result2 有什么期望?目前还不清楚输出应该是什么。您是否阅读过有关该错误的其他各种帖子?
  • 你的意思是像[d[k] for k in x]这样的东西吗?
  • @jonrsharpe 结果应该是[1, 1, 3]。编辑以提供可能的结果。
  • @Tomothy32 是的。这是否等同于示例,还是我应该预期性能提升,因为您的迭代器可以事先确定大小?
  • @Steve 通常,列表推导比 for 循环更快。另一种选择是list(map(d.get, x))。你应该自己尝试每一个解决方案,看看什么是最好的。根据我的尝试,itemgetter 是最快的。

标签: python python-3.x dictionary


【解决方案1】:

dict 的键必须是可散列的,而 x 等列表不是,这就是为什么当您尝试使用 x 作为索引键时会收到 TypeError: unhashable type: 'list' 错误字典d

如果您尝试执行批量字典查找,您可以改用operator.itemgetter 方法:

from operator import itemgetter
itemgetter(*x)(d)

这会返回:

(1, 1, 3)

【讨论】:

    【解决方案2】:

    如果您使用的是默认 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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多