2011-04-07 5 views
5

के साथ पाइथन ऑब्जेक्ट्स की एक सूची में शामिल होना मैंने पहले से ही this question on representing strings in Python देखा है लेकिन मेरा प्रश्न थोड़ा अलग है।__str__ विधि

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

फिर भी यह कर कि हर बार जब मैं वस्तुओं को एक साथ शामिल करना चाहते हैं से बचने के लिए अच्छा होगा

कोड यह रहा। क्या यह बस संभव नहीं है?

+0

आगे बढ़ें और कार्यवाही क्या कर रहे हैं उसे अनदेखा करें; यह '__str__' विधि के साथ कोई भी वर्ग हो सकता है। –

उत्तर

10

आपको उनसे जुड़ने से पहले अपनी ऑब्जेक्ट्स को स्ट्रिंग करना होगा। ऐसा इसलिए है क्योंकि str.join तारों की एक श्रृंखला की अपेक्षा करता है, और आपको इसे तारों की श्रृंखला देना होगा।

पठनीयता की लागत पर कम टाइपिंग के लिए, आप "\n".join(map(str, list_of_things) कर सकते हैं।

+0

एक जनरेटर अभिव्यक्ति का उपयोग करने के लिए एक विकल्प होगा: '' \ n '.join ((x) list_of_things में x के लिए str (x))' – Wesley

+1

ओपी ने अपनी पोस्ट में क्या किया था, जो मुझे विश्वास है, पसंदीदा तरीका है मानचित्र का उपयोग करने पर। – DTing

+0

धन्यवाद। मैं उम्मीद कर रहा था कि इस निहितार्थ को इस तरह से बनाने का कोई तरीका था कि जावास्क्रिप्ट स्ट्रिंग के रूप में उपयोग किए जाने पर ऑब्जेक्ट पर स्वचालित रूप से .toString() विधि को कॉल करता है। फिर निश्चित रूप से मुझे याद आया: [स्पष्ट रूप से स्पष्ट है।] (Http://www.python.org/dev/peps/pep-0020/) –

0

आप तकनीकी रूप से पाइथन ऑब्जेक्ट्स की सूची में शामिल नहीं हो रहे हैं, बस उनकी स्ट्रिंग प्रस्तुति।

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

>>> 
2

शायद कोई अद्भुत तरीका है।

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

यदि आप __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

'str.join() 'में रैखिक जटिलता है, यह वर्गबद्ध है। सूची की किसी भी लंबाई के लिए यह उत्पादित सभी अस्थायी मध्यवर्ती तारों से भयानक प्रदर्शन करने जा रहा है। – Duncan

1

"... यह हर कर रही से बचने के लिए अच्छा होगा समय ... "

आप एक ही कोड को दो बार दोहराने से बचना चाहते हैं? फिर फ़ंक्शन का उपयोग करें ;:

def join_as_str(alist): 
    return "\n".join(str(item) for item in alist) 
संबंधित मुद्दे