带有list关键字的Python字典

Dog*_*rld 1 python dictionary markov-chains

我正在编码一个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}
Run Code Online (Sandbox Code Playgroud)

不幸的是,列表和元组是不可用的,我不能将它们用作dicts中的关键字......我希望能很好地解释我的问题,以便你理解我想要实现的目标.

如何为字典关键字使用多个值的任何好主意?

后续问题:

我不知道元组是可以清洗的.但是哈希的熵似乎很低.元组是否可能发生哈希冲突?!

Fre*_*Foo 6

元组可哈希时,它们的内容.

>>> a = {}
>>> a[(1,2)] = 'foo'
>>> a[(1,[])]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

至于碰撞,当我尝试一堆非常相似的元组时,我看到它们被广泛分开地映射:

>>> 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
Run Code Online (Sandbox Code Playgroud)