3

以下のように定義された Graph クラスと Vertex クラスがあるとします。

Graph.py

class Graph:

def __init__(self):
    self.adjacencyList = {}

def __str__(self):
    return str(self.adjacencyList)

def addVetex(self,key,value):
    if Vertex(key,value) not in self.adjacencyList:
        self.adjacencyList[Vertex(key,value)] = []

Vertex.py

class Vertex:
def __init__(self,key,value):
    self.key = key
    self.value = value

def __str__(self):
    return "Key: ",str(self.key)," Value: ",str(self,value)

def __hash__(self):
    return self.key

私がこれを行う場合:

G = Graph()
G.addVetex(1,None)
G.addVetex(2,None)
G.addVetex(1,3)
print G

印刷されますが{<Vertex.Vertex instance at 0x110295b90>: [], <Vertex.Vertex instance at 0x110295bd8>: []}、次のようなものを期待しています{"Key:1 Value:None":[]...}

私の質問は、私が間違っていることは何ですか? 辞書が出力されたとき、なぜそのキー/値のstr関数を呼び出そうとしないのですか?

ありがとう。

4

4 に答える 4

5

現在のコードで必要な文字列を取得するために実装するメソッドはVertex.__repr__、Pythonディクショナリがキーの文字列表現を取得するために使用するものだと思います。

これは、との違いに光を当てる、関連するスタックオーバーフローの回答です。__repr____str__

于 2013-01-11T12:20:47.807 に答える
1

ジョーの答えは正しいです。コードのテスト済みバージョンは次のとおりです。

def __repr__(self):
    return "Key: "+str(self.key)+" Value: "+str(self.value)

で実装されVertexます。また、質問のようにタプルではなく、文字列が返されることも重要です。

于 2013-01-11T12:23:26.210 に答える
1

これでできます。reprメソッドの追加(およびstrメソッドの少しのクリーンアップ) に注意してください。

class Vertex:
    def __init__(self,key,value):
        self.key = key
        self.value = value

    def __str__(self):
        return "{Key: "+str(self.key)+" Value: "+str(self.value)+"}"

    def __hash__(self):
        return self.key

    def __repr__(self):
        return str(self)

ただし、頂点クラスの辞書をサブクラス化することを検討してください。dict のすべての利点が得られますが、必要に応じてメソッドを追加できます。これの最も単純なバージョンは次のようになります。

class Vertex(dict):
    pass
于 2013-01-11T12:25:32.537 に答える
-1

次のようなことができます:

class Graph(object):
    def __str__(self):
        return ", ".join("Key: " + str(i.key) + " Value: " + str(i.value) for i in self.adjacencyList)
于 2013-01-11T12:27:49.623 に答える