Python __str__和列表

时间:2009-04-07 21:58:00

标签: python

在Java中,如果我调用List.toString(),它将自动调用List内每个对象的toString()方法。例如,如果我的列表包含对象o1,o2和o3,则list.toString()将如下所示:

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

有没有办法在Python中获得类似的行为?我在我的类中实现了__str __()方法,但是当我打印出一个对象列表时,使用:

print 'my list is %s'%(list)

它看起来像这样:

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

如何让python自动为列表中的每个元素(或者dict)调用我的__str__?

9 个答案:

答案 0 :(得分:122)

在python列表上调用字符串会在内部的每个元素上调用__repr__方法。对于某些项目,__str____repr__是相同的。如果您想要这种行为,请执行以下操作:

def __str__(self):
    ...
def __repr__(self):
    return self.__str__()

答案 1 :(得分:20)

您可以使用list comprehension自动生成每个项目str()的新列表:

print([str(item) for item in mylist])

答案 2 :(得分:7)

您可以做两件简单的事情,使用map功能或使用理解。

但是这会得到一个字符串列表,而不是一个字符串。所以你也必须加入这些字符串。

s= ",".join( map( str, myList ) )

s= ",".join( [ str(element) for element in myList ] )

然后你可以打印这个复合字符串对象。

print 'my list is %s'%( s )

答案 3 :(得分:4)

根据您要使用该输出的内容,或许__repr__可能更合适:

import unittest

class A(object):
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return repr(self.val)

class Test(unittest.TestCase):
    def testMain(self):
        l = [A('a'), A('b')]
        self.assertEqual(repr(l), "['a', 'b']")

if __name__ == '__main__':
    unittest.main()

答案 4 :(得分:3)

我同意之前关于使用列表推导来做到这一点的答案,但你当然可以将它隐藏在一个函数后面,如果那就是浮动你的船。

def is_list(value):
    if type(value) in (list, tuple): return True
    return False

def list_str(value):
    if not is_list(value): return str(value)
    return [list_str(v) for v in value]

为了好玩,我以列表中包含的所有内容递归列出了list_str()。

答案 5 :(得分:0)

这样的东西?

a = [1, 2 ,3]
[str(x) for x in a]
# ['1', '2', '3']

答案 6 :(得分:0)

这足够了。

在打印列表以及其他容器类时,将使用connect( &p, SIGNAL(finished(int)), this, SLOT(cmdFinished()) ); 打印包含的元素,因为__repr__用于内部对象表示。 如果我们致电:__repr__,它将告诉我们:

help(object.__repr__)

如果我们调用Help on wrapper_descriptor: __repr__(self, /) Return repr(self). ,它将输出:

help(repr)

如果为对象实现了Help on built-in function repr in module builtins: repr(obj, /) Return the canonical string representation of the object. For many object types, including most builtins, eval(repr(obj)) == obj. ,但不是__str____repr__将输出默认输出,就像未实现repr(obj)一样。

因此,唯一的方法是为您的课程实现print(obj)。一种可行的方法是:

__repr__

答案 7 :(得分:-1)

您可以使用格式。

    def __str__(self):
       return("my list is".format(self.list1))

答案 8 :(得分:-3)

您得到的输出只是对象的模块名称,类名称,然后是十六进制的内存地址,因为__repr__函数不会被覆盖。

__str__用于使用print时对象的字符串表示形式。但是,由于要打印对象列表,而不是遍历该列表以为每个项目调用str方法,因此它会打印出对象表示形式。

要调用__str__函数,您需要执行以下操作:

'my list is %s' % [str(x) for x in myList]

如果您覆盖__repr__函数,则可以像以前一样使用打印方法:

class cell:
    def __init__(self, id):
        self.id = id
    def __str__(self):
        return str(self.id) # Or whatever
    def __repr__(self):
        return str(self) # function invoked when you try and print the whole list.

myList = [cell(1), cell(2), cell(3)]
'my list is %s' % myList

然后您将获得“ my list is [1, 2, 3]”作为输出。