0

別のリストのオブジェクトを使用して、辞書のリストを参照できるようにしたいと考えています。最初のリストは矩形オブジェクトのリストで、2 番目のリストは最初のリストから分割されたより小さな rect オブジェクトのリストです。

これは私が試したものです:

def merge(self, parent_list, child_list):
    tile_dict = dict(zip(parent_list, child_list))
    return tile_dict

ただし、「ハッシュできない型: pygame.Rect」というエラーが表示されます。この目的でdictを使用することはできませんか? もしそうなら、最初に意図されたものと同様のことを達成するための適切なリスト内包表記は何でしょうか?

4

2 に答える 2

4

pygame.Rect から派生した独自のクラスを定義できます。

class HashableRect(pygame.Rect):
    def __hash__(self):
        return hash(tuple(self))

正常に動作します:

 >>> r = HashableRect(1,2,3,4)
 >>> {r: 'something'}
 {<rect(1, 2, 3, 4)>: 'something'}

これに関する問題:pygame.Rect可変型です。含まれる値を変更できるため、ハッシュが変更されますが、これは発生しないはずです。

オブジェクト ID のみを気にする場合はid(self)、ハッシュ値として返すことができます。

または、それをタプルに変換することもできます(基本的にはとにかく4タプル以上ではありません)、それを辞書のキーとして使用し、ルックアップを行う場合:

def merge(self, parent_list, child_list):
    tile_dict = dict(zip(map(tuple, parent_list), child_list))
    return tile_dict

merged = merge(prarent_list, child_list)
...
child = merged[tuple(parent)]
于 2013-04-11T16:44:17.857 に答える
0

ディクショナリのキーはハッシュ可能である必要があり__hash__ます。つまり、オブジェクトが同じ「値」を持ち、オブジェクトの存続期間中に変更されない場合に同じ出力を生成するメソッドが必要です。該当する場合は、そのハッシュ メソッドを提供する必要があります。または、両方のリストのリストを保持し、親のインデックスごとに子をルックアップすることで dict をシミュレートする必要があります。これは機能しますが、O(n) ルックアップ コストになります。

于 2013-04-11T16:47:10.620 に答える