带列表关键字的Python字典

带列表关键字的Python字典,python,dictionary,markov-chains,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") i

我在编一个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}
不幸的是,列表和元组是不可修改的,我不能在dicts中将它们用作关键字。。。 我希望我已经很好地解释了我的问题,让你们理解我试图实现的目标

有什么好主意我可以使用字典关键字的多个值吗

跟进问题:

我不知道元组是可散列的。 但是散列的熵似乎很低。元组可能存在哈希冲突吗

元组的内容是可散列的

>>> a = {}
>>> a[(1,2)] = 'foo'
>>> a[(1,[])]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
元组的内容是可散列的

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

您可以使用元组作为字典键,只要它们的内容是可散列的,它们就是可散列的(正如@larsman所说)

不要担心冲突,Python的dict会处理它

>>> hash('a')
12416037344
>>> hash(12416037344)
12416037344
>>> hash('a') == hash(12416037344)
True
>>> {'a': 'one', 12416037344: 'two'}
{'a': 'one', 12416037344: 'two'}

在这个例子中,我使用了一个字符串和一个整数。但它对元组也是如此。只是不知道如何找到两个具有相同哈希值的元组。

您可以将元组用作字典键,只要它们的内容是可哈希的(正如@larsman所说),它们都是可哈希的

不要担心冲突,Python的dict会处理它

>>> hash('a')
12416037344
>>> hash(12416037344)
12416037344
>>> hash('a') == hash(12416037344)
True
>>> {'a': 'one', 12416037344: 'two'}
{'a': 'one', 12416037344: 'two'}

在这个例子中,我使用了一个字符串和一个整数。但它对元组也是如此。只是不知道如何找到两个具有相同哈希值的元组。

列表和元组是不可哈希的-元组是可哈希的。(如果它们的内容是可散列的,正如@larsmans正确指出的)一个空格缩进?这读起来非常难看。您应该遵循PEP-8并使用4-space indentation.eumiro,谢谢!增加了关于哈希冲突列表的后续问题,元组是不可哈希的-元组是可哈希的。(如果它们的内容是可散列的,正如@larsmans正确指出的)一个空格缩进?这读起来非常难看。您应该遵循PEP-8并使用4-space indentation.eumiro,谢谢!增加了关于散列冲突的后续问题