2011-04-07 12 views
5

Zaten this question on representing strings in Python'a baktım ama sorum biraz farklı.python nesnelerinin bir listesini __str__ yöntemi ile birleştirerek

>>> 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 

umarım bu işe farkında:

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

Yine her zaman ben birlikte nesneleri katılmak istiyorum bunu önlemek güzel olurdu

İşte kod. Bu mümkün değil mi?

+0

Devam edin ve işlevlerin çıktısını dikkate almayın; Bu, __str__' yöntemiyle herhangi bir sınıf olabilir. –

cevap

10

Nesnelerinize katılabilmeniz için önce bunları dizginlemek zorundasınız. Bunun nedeni, str.join'un bir dizi dizeyi beklemesidir ve ona bir dizi dizeyi vermeniz gerekir.

Okunabilirlik pahasına daha az yazarak, "\n".join(map(str, list_of_things) yapabilirsiniz.

+0

Bir alternatif, bir jeneratör ifadesi kullanmaktır: '\ n'.join ((list_of_things öğesinde x için str (x))) – Wesley

+1

OP’nin postasının yaptığı şey, ki, inanıyorum ki, tercih edilen yoldur haritayı kullanarak. – DTing

+0

Teşekkürler. Bunu, JavaScript'in bir dize olarak kullanıldığında bir nesnede .toString() yöntemini otomatik olarak çağırabileceği şekilde bu zımni bir şekilde yapmanın bir yolu olduğunu umuyordum. Sonra tabii ki hatırladım: [Açık, örtük olmaktan iyidir.] (Http://www.python.org/dev/peps/pep-0020/) –

0

Teknik olarak python nesnelerinin listesine, yalnızca dize temsiline katılmıyorsunuz.

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

Bu kadar iyi çalışıyor ama her güzel görünmüyor:

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

>>> 
2

muhtemelen hiçbir şaşırtıcı bir yolu vardır. Bir __add__ yöntemi eklendi eğer sizin için

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

işe yarar mı? Örneğin,

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 

her bunu önlemek iyi olurdu ...

strange_thing = reduce(add,weird_list) 
print strange_thing 

verir

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

ve bu,

yvu 
+0

'str.join()', lineer karmaşıklığa sahiptir, bu kareseldir. Listenin herhangi bir uzunluğu için üretilen geçici ara dizilerden korkunç performansa sahip olacak. – Duncan

1

" verir zaman ... "

Aynı kodu tekrar tekrar tekrarlamaktan kaçınmak ister misiniz? Sonra bir işlev kullanın ;:

İlgili konular