使用__str__方法连接python对象列表

时间:2011-04-07 23:10:22

标签: python string

我已经看过this question on representing strings in 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 个答案:

答案 0 :(得分:10)

您必须先对对象进行字符串化,然后才能加入它们。这是因为str.join需要一系列字符串,你必须给它一系列字符串。

为了减少打字而牺牲可读性,您可以"\n".join(map(str, list_of_things)

答案 1 :(得分:2)

可能没什么了不起的。

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

答案 2 :(得分:2)

“......每次都避免这样做会很好......”

您想避免多次重复相同的代码吗?然后使用函数;:

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

答案 3 :(得分:1)

如果您添加了__add__方法,它会对您有用吗?如,

from operator import add
from random import randint

class WeirdThing(object):
    def __init__(self,me=None):
        self.me = me if me else chr(randint(97,122))
    def __str__(self):
        return "%s" % self.me
    def __repr__(self):
        return ";%s;" % self.me
    def __add__(self,other):
        new_me = add(str(self.me),str(other.me))
        return WeirdThing(new_me)

weird_list = [WeirdThing(), WeirdThing(), WeirdThing()]
print weird_list

给出,

[;y;, ;v;, ;u;]

这个,

strange_thing = reduce(add,weird_list)
print strange_thing

给出,

yvu

答案 4 :(得分:0)

从技术上讲,您没有加入python对象列表,只是它们的字符串表示。

>>> reduce(lambda x,y: "%s\n%s" % (x,y), weird_list)
'1302226564.83\n1302226564.83\n1302226564.83'
>>> 

这也有效,但看起来并不好看:

>>> a = ""
>>> for x in weird_list:
...     a+="%s\n" % x
... 
>>> print a
1302226564.83
1302226564.83
1302226564.83

>>>