Присоединение списка объектов Python с помощью метода __str__ - PullRequest
7 голосов
/ 08 апреля 2011

Я уже рассмотрел этот вопрос о представлении строк в 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 ]

10 голосов
/ 08 апреля 2011

Вы должны упорядочить свои объекты, прежде чем вы сможете присоединиться к ним. Это связано с тем, что str.join ожидает последовательность строк, и вы должны задать ей последовательность строк.

Ради экономии текста за счет читабельности вы можете сделать "\n".join(map(str, list_of_things).

2 голосов
/ 08 апреля 2011

"... было бы неплохо избегать этого каждый раз ..."

Вы хотите не повторять один и тот же код несколько раз?Затем используйте функцию;

1004 *
2 голосов
/ 08 апреля 2011

Наверное, нет ничего удивительного.

def strjoin(glue, iterable):
    return glue.join(str(s) for s in iterable)
1 голос
/ 08 апреля 2011

Будет ли у вас работать, если вы добавите метод __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
0 голосов
/ 08 апреля 2011

Технически, вы не присоединяетесь к списку объектов 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

>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...