Python:如何正确打印字典中的对象键?

时间:2013-01-11 12:08:39

标签: python dictionary

假设我有一个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 个答案:

答案 0 :(得分:5)

我相信你想用你当前代码获得你想要的字符串的方法是Vertex.__repr__,这是python字典用来获取键的字符串表示的方法。

这是一个related stackoverflow答案,阐明了__repr____str__

之间的区别

答案 1 :(得分:1)

Joe的回答是正确的,这是代码的测试版本:

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

将在Vertex中实施。同样重要的是返回一个字符串,而不是问题中的元组。

答案 2 :(得分: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。您可以获得dict的所有好处,但可以添加方法以满足您的需求。最简单的版本如下:

class Vertex(dict):
    pass

答案 3 :(得分:-1)

你可以这样做:

class Graph(object):
    def __str__(self):
        return ", ".join("Key: " + str(i.key) + " Value: " + str(i.value) for i in self.adjacencyList)