在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__?
答案 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]
”作为输出。