2

全て -

今日は非常に基本的な質問があります...しかし、それが私のプログラミングで生産的に進むことを妨げているので、ここに投稿します。

辞書をキーにした辞書を作りたい。おそらく私は辞書への参照をキーとして渡すことしかできません...Pythonでそれを行う方法がわからないだけです。これが私がやろうとしていることのおもちゃの削減です:

def test( dict ):
    a={}
    b={1:1}
    a[ dict ] = b
    return a

a = {0:0}
print test( a ) 

bを{{0:0}:{1:1}}の形式の辞書にします。

これに関するどんな助けも大いに感謝されます。

敬具 -

パット

4

5 に答える 5

2

辞書のキーはハッシュ可能なアイテムである必要があります。残念ながら、辞書自体はハッシュ化できません(辞書は変更可能であるため、ハッシュ化できなくなります)。

代わりに、ソートされたタプルに変換されたアイテムリストを使用してください。

a[tuple(sorted(dct.items()))] = b

可変オブジェクトはインプレースで変更できるためハッシュ可能ではなく、後のキールックアップは失敗します。たとえば、キーとして使用した辞書にアイテムを追加または削除した場合、期待される結果はどうなりますか?

于 2012-08-21T18:48:16.773 に答える
1

ディクショナリは、ハッシュ可能なオブジェクトのみをキーとして使用できます。つまり、ディクショナリは不変である必要があります。デフォルトの辞書も機能しないため、機能しません。ただし、 frozendictを試すことはできます。

于 2012-08-21T18:48:33.520 に答える
1

Python wiki

ディクショナリキーとして使用するには、オブジェクトはハッシュ関数(__hash__など)、等式比較(__eq__または__cmp__など)をサポートし、上記の正しさの条件を満たす必要があります。

だからこれを試してみてください:

a = {0: 0}
hash(a)

エラーが発生します:

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    hash(a)
TypeError: unhashable type: 'dict'

基本的には、mgilsonがすでに言ったことを確認するだけです。辞書(またはリストなど)を辞書のキーとして使用する限り、運が悪いです。

于 2012-08-21T18:50:10.897 に答える
1

dictはハッシュできないため、キーとして使用することはできません。

hash(a)

だから私はあなたの問題を再考するでしょう、あるいはあなたが本当にあなたが表すことができるdictをハッシュする必要があるなら、それは文字列、またはタプルとそれによるハッシュです:

hash(tuple(dict.items()))
hash(''.join(["%s%s" %(k, v) for k,v in dict.items()]))
于 2012-08-21T18:53:17.970 に答える
0

返信してくれたすべての人に感謝します。これはかなり基本的な質問であり、ハッシュ可能性と可変性に関するすべての情報が高く評価されていることを私は知っています。

私は確かに、入力ベクトル(辞書自体)をそのアイテムのソートされたタプルにマッピングするアプローチを追求します。これは、特定の辞書を明確に特徴づけ、辞書キーとして使用できるようにハッシュ可能なデータ構造です。

def get_key( dict1, dict2 ):

    list = dict1.items() + dict2.items()
    list.sort()
    return tuple( list )

a,b = {'feature1':0}, {'feature1':1}
print get_key( a, b )
于 2012-08-22T16:30:28.077 に答える