簡體   English   中英

帶列表關鍵字的Python字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM