0

リストが既にPythonの辞書にあるかどうかを確認しようとしています。私のコードは、2 つの乱数 (r1 と r2) を生成し、それらの同じ 2 つの数値がまだそこにない場合、それらを辞書のリストに追加することになっています。コードは次のとおりです。

main_dict = {0:[], 1:[], 2:[], 3:[], 4:[]}
for x in range(0,5):
    r1 = randint(1,5)
    r2 = randint(1,5)
    temp = [r1,r2]
    if temp not in main_dict:
        main_dict[x].append(r1)
        main_dict[x].append(r2)

したがって、基本的に main_dict は次のようになります: {0:[2,3],1:[4,1],2:[3,3],3:[3,2],4:[5,1]} 、および上記のコードは、組み合わせが繰り返されないように注意する必要があります。

エラーは「TypeError:unhashable type: 'list'」です。これは、if の隣にリストを配置できないためだと思いますが、他に何を配置すればよいかわかりません。マインド。

前もって感謝します :)

4

3 に答える 3

4

あなたが得ている問題は、リストが存在する場合に辞書を探しているためです。これで、リストを辞書のキーと比較しています。あなたがしたいことは次のとおりです。

if temp not in manin_dict.values():
于 2013-08-23T17:33:39.263 に答える
2

if temp not in main_dict:に変更if temp not in main_dict.values():

于 2013-08-23T17:33:30.013 に答える
1

リストは変更できるため、ハッシュできません。リストの代わりにタプルを使用し、重複を避けるためにセットを使用すると、必要なことを効率的に行うことができます。ただし、リストを変更する場合は、回避する必要がある問題がいくつかある可能性があります。

main_dict = dict((i,[]) for i range(0,5))
main_set = set()
for x in range(0,5):
    r1 = randint(1,5)
    r2 = randint(1,5)
    temp = (r1,r2) # This is the same as tuple([r1,r2])
    if temp not in main_set:
        main_dict[x] = temp
        main_set.add(temp)

タプルのセットだけが必要な場合は、辞書を避けてセットに追加できることに注意してください。セットを使用する理由は、要素がセット内にあるかどうかのチェックは O(1) であり、要素が辞書値のリスト内にあるかどうかのチェックは O(N) であるためです。値が 5 つしかない場合に気付くことはありませんが、それ以上の値がある場合は間違いなくそうです。

于 2013-08-23T20:34:40.533 に答える