String building using join

gervaz gervaz at gmail.com
Sun Jan 2 16:37:50 EST 2011


On 2 Gen, 19:14, Emile van Sebille <em... at fenx.com> wrote:
> On 1/2/2011 9:43 AM gervaz said...
>
>
>
>
>
> > On 31 Dic 2010, 16:43, Emile van Sebille<em... at fenx.com>  wrote:
> >> On 12/31/2010 7:22 AM gervaz said...
>
> >>> Hi all, I would like to ask you how I can use the more efficient join
> >>> operation in a code like this:
>
> >>>>>> class Test:
> >>> ...     def __init__(self, v1, v2):
> >>> ...         self.v1 = v1
> >>> ...         self.v2 = v2
> >>> ...
> >>>>>> def prg(l):
> >>> ...     txt = ""
> >>> ...     for x in l:
> >>> ...         if x.v1 is not None:
> >>> ...             txt += x.v1 + "\n"
> >>> ...         if x.v2 is not None:
> >>> ...             txt += x.v2 + "\n"
> >>> ...     return txt
> >>> ...
> >>>>>> t1 = Test("hello", None)
> >>>>>> t2 = Test(None, "ciao")
> >>>>>> t3 = Test("salut", "hallo")
> >>>>>> t = [t1, t2, t3]
>
> >>>>>> prg(t)
> >>> 'hello\nciao\nsalut\nhallo\n'
>
> >>> The idea would be create a new list with the values not None and then
> >>> use the join function... but I don't know if it is really worth it.
> >>> Any hint?
>
> >>>>>> def prg2(l):
>
> >>               return "\n".join([x for x in l if x])
>
> >> Emile
>
> >>> ...     e = []
> >>> ...     for x in l:
> >>> ...         if x.v1 is not None:
> >>> ...             e.append(x.v1)
> >>> ...         if x.v2 is not None:
> >>> ...             e.append(x.v2)
> >>> ...     return "\n".join(e)
> >>> ...
> >>>>>> prg2(t)
> >>> 'hello\nciao\nsalut\nhallo'
>
> >>> Thanks, Mattia- Nascondi testo citato
>
> >> - Mostra testo citato -- Nascondi testo citato
>
> >> - Mostra testo citato -
>
> > Sorry, but it does not work
>
> Oh -- you want a working solution, not a hint?  OK.
>
> class Test:
>       def __init__(self, v1, v2):
>           self.v1 = v1
>           self.v2 = v2
>
> t1 = Test("hello", None)
> t2 = Test(None, "ciao")
> t3 = Test("salut", "hallo")
> t = [t1, t2, t3]
>
> "\n".join([y for x in t for y in [x.v1,x.v2] if y])
>
> Emile
>
>
>
>
>
> >>>> def prg3(l):
> > ...     return "\n".join([x for x in l if x])
> > ...
> >>>> prg3(t)
> > Traceback (most recent call last):
> >    File "<stdin>", line 1, in<module>
> >    File "<stdin>", line 2, in prg3
> > TypeError: sequence item 0: expected str instance, Test found- Nascondi testo citato
>
> - Mostra testo citato -- Nascondi testo citato
>
> - Mostra testo citato -

Thanks Emile, despite that now the solution runs in quadratic time I
guess. I could also provide a __str__(self) representation, but in my
real code I don't have access to the class. Also using str() on an
empty object (i.e. None), the representation is 'None'.

Ciao,

Mattia



More information about the Python-list mailing list