[英]Python dictionary with list keyword
我正在编码一个N阶马尔可夫链。
它是这样的:
class Chain:
def __init__(self, order):
self.order = order
self.state_table = {}
def train(self, next_state, *prev_states):
if len(prev_states) != self.order: raise ValueError("prev_states does not match chain order")
if prev_states in self.state_table:
if next_state in self.state_table[prev_states]:
self.state_table[prev_states][next_state] += 1
else:
self.state_table[prev_states][next_state] = 0
else:
self.state_table[prev_states] = {next_state: 0}
不幸的是,列表和元组是不可散列的,我不能将它们用作字典中的关键字...希望我已经很好地解释了我的问题,以使您理解我要实现的目标。
有什么好的主意,如何可以为字典关键字使用多个值?
后续问题:
我不知道元组是可哈希的。 但是散列的熵似乎很低。 元组是否可能发生哈希冲突?
当元组的内容是可哈希的时。
>>> a = {}
>>> a[(1,2)] = 'foo'
>>> a[(1,[])]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
至于冲突,当我尝试一堆非常相似的元组时,我看到它们被广泛地映射:
>>> hash((1,2))
3713081631934410656
>>> hash((1,3))
3713081631933328131
>>> hash((2,2))
3713082714462658231
>>> abs(hash((1,2)) - hash((1,3)))
1082525
>>> abs(hash((1,2)) - hash((2,2)))
1082528247575
您可以使用元组作为字典键,只要它们的内容是可哈希的(如@larsman所说),它们就可以哈希。
不必担心冲突,Python的dict会处理它。
>>> hash('a')
12416037344
>>> hash(12416037344)
12416037344
>>> hash('a') == hash(12416037344)
True
>>> {'a': 'one', 12416037344: 'two'}
{'a': 'one', 12416037344: 'two'}
在此示例中,我使用了一个字符串和一个整数。 但是它对元组的作用相同。 只是不知道如何找到具有相同哈希值的两个元组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.