2012-02-07 8 views
2

私はPythonには新しく、ちょっと試してみましたが、リストをタプルにして辞書のキーとして使うのに問題がありました。ここではそれがより明確にすべき例は、です:これは完璧に動作し、私は辞書のキーとして使用することができる2つの値を持つことができます辞書のタプルにリストを割り当てるにはどうしたらいいですか?

dict_of_lists_values = {} 
dict_of_lists_values[('dog', 'cat')] = 10 
dict_of_lists_values[('dog1', 'cat1')] = 10 
dict_of_lists_values[('dog1', 'cat2')] = 10 
dict_of_lists_values 
{('dog', 'cat'): 10, ('dog1', 'cat2'): 10, ('dog1', 'cat1'): 10} 

。私は、リストにこれを適用しようとすると、私はエラーを取得:私の以前の実験に基づいてTypeError: unhashable type: 'list'

dict_of_lists_values = {} 
a = [22, 39, 0] 
b = [15, 38, 12] 
dict[(a, b)] = 'please work' 

を、と私は文字列にリストを変換する場合、それが働くだろうと思いますが、私はそれとしてそれをしたいです文字列ではない。

これは可能ですか?

+0

また、タイトルが混乱していると申し訳ありません。私はあまり混乱しないタイトルを考えました(この問題をどのように混乱させるかがわかりました:-) – Lostsoul

+2

これは失敗します。タプルは各要素のハッシュから構成されます。 –

+0

私はそれが私の最初の例と同様に変換されたと思った。私はPythonのタプルに関する私の本を見直すつもりです...明確化のためにありがとう.. – Lostsoul

答えて

4

リストのtuple()を呼び出して、リスト内の要素を含むタプルを作成します。

1

Pythonの辞書は、不変/ハッシュ可能なキーしか持つことができません。

文字列、数字、およびタプルは不変なので、辞書キーとして使用できます。インスタンスには固有の__hash__()があるため、使用することもできます。しかし、リストは変更可能であるため、キーとして使用することはできません。

+1

男、私は眠いです。それを後ろに持ってきた。ラッセル編集ありがとう。 –

3

いいえ、list種類の辞書キーは使用できません。ただし、listを拡張し、ハッシュ可能にしてから、その新しいタイプを使用できます。 (ちょっと面倒ですが)

class hlist(list): 
    def __hash__(self): 
     # Hash it somehow; here, I convert it to a hashable tuple ... and then hash it 
     return hash(tuple(self)) 

l1 = hlist([1,2,3]) 
l2 = hlist([4,5,6]) 

d = { 
    l1:"Hi.", 
    l2:"Hello!" 
} 

下記のSvenさんのコメントにご注意ください。変更可能なキーは、変更されたときにそのハッシュが失効するため危険です。

+1

リストが変更されたときにハッシュが変更されるので、これは非常に悪い考えです。変更可能な辞書キーを使用する場合は、ハッシュが変更されないことを確認してください。 –

+0

@SvenMarnachリストが変更された場合、なぜハッシュを変更したくないのですか?質問は、アイデンティティベースのものではなく、コンテンツベースのキーを求めるように見える。または私はあなたを誤解していますか? – cheeken

+3

問題を説明するための[example](http://ideone.com/1UEdb)です。ハッシュが変更された場合、元のハッシュを使用してハッシュテーブル内の位置が決定されたため、辞書オブジェクトはキーを見つけることができなくなります。 –

関連する問題