使用 .join 函数连接实现 __str__ 方法的非字符串 Python 对象列表

12 投票
5 回答
7039 浏览
提问于 2025-04-16 15:19

我已经看过了关于在Python中表示字符串的这个问题,但我的问题稍微有点不同。它也和如何将列表中的项目连接成一个字符串的问题不同,因为那个问题是针对字符串列表的,所以对我这个问题没有任何帮助(我这个问题主要是处理非字符串项目的挑战)。

这是代码:

>>> class WeirdThing(object):
...     def __init__(self):
...         self.me = time.time()
...     def __str__(self):
...         return "%s" % self.me
...     def __repr__(self):
...         return ";%s;" % self.me
... 
>>> weird_list = [WeirdThing(), WeirdThing(), WeirdThing()]
>>> print weird_list
[;1302217717.89;, ;1302217717.89;, ;1302217717.89;]
>>> "\n".join(weird_list)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: sequence item 0: expected string, WeirdThing found

我意识到这样是可以的:

>>> "\n".join(str(wi) for wi in weird_list)
'1302217717.89\n1302217717.89\n1302217717.89'
>>> 

不过,每次我想把这些对象放在一起的时候,能不能不这样做呢?这真的不可能吗?

5 个回答

3

可能没有什么特别好的方法。

def strjoin(glue, iterable):
    return glue.join(str(s) for s in iterable)
3

“...每次都这样做可真麻烦...”

你想避免重复写同样的代码吗?那就用一个函数吧;

def join_as_str(alist):
    return "\n".join(str(item) for item in alist)
14

在你把对象连接起来之前,得先把它们转换成字符串。这是因为 str.join 这个方法需要一系列的字符串,而你必须提供这样的字符串。

为了减少输入的内容,虽然可能会影响可读性,你可以使用 "\n".join(map(str, list_of_things)) 这个写法。

撰写回答