Python __str__和列表

ben*_*hsu 103 python

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

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Run Code Online (Sandbox Code Playgroud)

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

print 'my list is %s'%(list)
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ger 128

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

def __str__(self):
    ...
def __repr__(self):
    return self.__str__()
Run Code Online (Sandbox Code Playgroud)

  • 使用`__repr__`识别`__str__`通常与[Python数据模型](https://docs.python.org/2/reference/datamodel.html#object.__repr__)不一致,因此列表理解解决方案由@ daniel-lew更加pythonic. (7认同)
  • 我认为 python 列表的默认行为是完全错误的。我希望列表中的 `str()` 为里面的每个单独元素返回 `str()`。 (4认同)
  • 在类级别使用 `__repr__ = __str__` 会更短。 (3认同)
  • 没有争论。我按要求回答了这个问题,这通常是python新手想要思考问题的方式,但这并不意味着这是最好的回答方式。 (2认同)
  • Python 应该与它自己的数据模型保持一致,并对所有原语和聚合做同样的事情。 (2认同)

Dan*_*Lew 21

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

print([str(item) for item in mylist])
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`print(map(str,mylist))` - 它有点短 (6认同)
  • 一个问题是,如果mylist中的项目也可能是列表 (3认同)

S.L*_*ott 7

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

但这会得到一个字符串列表,而不是字符串.所以你还必须将字符串连接在一起.

s= ",".join( map( str, myList ) )
Run Code Online (Sandbox Code Playgroud)

要么

s= ",".join( [ str(element) for element in myList ] )
Run Code Online (Sandbox Code Playgroud)

然后,您可以打印此复合字符串对象.

print 'my list is %s'%( s )
Run Code Online (Sandbox Code Playgroud)