【问题标题】:Is there a better way to create a dictionary key in python than converting to string?有没有比转换为字符串更好的方法在 python 中创建字典键?
【发布时间】:2014-06-23 09:38:15
【问题描述】:

我有一个函数可以返回与 3D 空间中的向量 F(i,j,k) 相关联的能量。

F() 是一个慢速函数,所以我有一个字典来检查是否为特定 i、j、k 调用了 F(),如果调用了,那么我就从字典中获取该值。

我目前正在这样做:

key = "_".join( [ str(i), str(j), str(k)  ])

if key not in dic: 
    dic[key] = F(i,j,k)

Energy = dic[key]

有没有比像这样连接向量更好的方法来创建密钥?

【问题讨论】:

  • 为了将来参考,第一行可以使用map简化为key = "_".join(map(str, (i, j, k)))

标签: python dictionary key


【解决方案1】:

字典键可以是任何hashable;三个值的元组就可以了:

key = i, j, k  # a comma makes this a tuple
try:
    Energy = dic[key]
except KeyError:
    Energy = dic[key] = F(i, j, k)

我在这里使用异常处理(请求宽恕),而不是显式测试密钥是否存在(请求许可);当缺少关键是关键是常态时,前者更快。

【讨论】:

  • 我使用 shelve 来存储我的字典。显然这不适用于元组作为键。泡菜是下一个最佳选择吗?
  • @egoburnswell: shelve 使用 pickle 作为实现。元组键应该可以与搁置一起正常工作;你看到的错误是什么?
  • 'TypeError: String or Integer object expected for key, tuple found'
  • @egoburnswell:我很抱歉,我确实看到 shelve 被记录为只接受字符串作为键。那是因为 values 是经过腌制的,但是这些值随后会存储在 DBM-style file 中,而正是 那种 格式限制了您的密钥。
  • @egoburnswell:将您的字典嵌套存储在shelveshelveobj['data'] = yourdict,确保在更改时重新分配给该键)或在这种情况下,只使用泡菜。
【解决方案2】:

由于 Python dicts 可以将任何 hashable 对象作为键[1],因此您可以使用 (i, j, k) 元组:

if (i, j, k) not in dic:
    dic[(i, j, k)] = F(i,j,k)
Energy = dic[(i, j, k)]

[1]https://docs.python.org/2/library/stdtypes.html#mapping-types-dict

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多