2011-12-30 4 views
1

私はN次マルコフチェーンをコーディングしています。リストキーワードのあるPython辞書

それはこのようなものになる:あなたが理解するために、私はうまくいけば十分に私の問題を説明した

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} 

Unfortunally、リストやタプルは非ハッシュある、と私はdictsのキーワードとしてそれらを使用することはできません... を私が達成しようとしているもの。

どのように私は辞書のキーワードに複数の値を使用できますか?

追加質問:

タプルがハッシュ可能であることはわかりませんでした。 しかし、ハッシュのエントロピーは低いようです。タプルのハッシュ衝突が可能ですか?

+4

*リストとタプルはハッシュ可能です* - タプルはハッシュ可能です。 (コンテンツがハッシュ可能な場合、@ larsmansが正しく記述されているため) – eumiro

+4

1スペースインデント?それは読むのが非常に醜いです。 PEP-8に従って、4桁のインデントを使用する必要があります。 – ThiefMaster

+0

eumiro、ありがとう!ハッシュ衝突に関する追加質問 –

答えて

6

タプルは、その内容が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 
3

あなたは辞書のキーとしてタプルを使用することができ、彼らは限りハッシュ可能ですそれらのコンテンツはハッシュ可能です(@larsmanが述べたように)。

衝突を心配しないで、Pythonのdictがそれを処理します。

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

この例では、文字列と整数を使用しました。しかし、タプルでも同じように動作します。同じハッシュを持つ2つのタプルを見つける方法が全く分かりませんでした。