Custom string joining

C

Claudiu Popa

Hello Python-list,

I have an object which defines some methods. I want to join a list or
an iterable of those objects like this:

new_string = "|".join(iterable_of_custom_objects)

What is the __magic__ function that needs to be implemented for
this case to work? I though that __str__ is sufficient but it doesn't seems to
work. Thanks in advance.

PC
 
M

Martineau

Hello Python-list,

I  have  an object which defines some methods. I want to join a list or
an iterable of those objects like this:

new_string = "|".join(iterable_of_custom_objects)

What   is   the   __magic__  function that needs to be implemented for
this case to work?  I  though  that  __str__  is sufficient butit doesn't seems to
work. Thanks in advance.

PC

Instead of join() here's a function that does something similar to
what the string join() method does. The first argument can be a list
of any type of objects and the second separator argument can likewise
be any type. The result is list of the various objects. (The example
usage just uses a list of string objects and separator to illustrate
what it does.)

def tween(seq, sep):
return reduce(lambda r,v: r+[sep,v], seq[1:], seq[:1])

lst = ['a','b','c','d','e']

print tween(lst, '|')
print ''.join(tween(lst, '|'))

Output:

['a', '|', 'b', '|', 'c', '|', 'd', '|', 'e']
a|b|c|d|e


It could be made a little more memory efficient by applying the
itertools module's islice() generator to the first 'seq' argument
passed to reduce():

def tween(seq, sep):
return reduce(lambda r,v: r+[sep,v], itertools.islice(seq,1,None),
seq[:1])
 
I

Ian Kelly

Instead of join() here's a function that does something similar to
what the string join() method does. The first argument can be a list
of any type of objects and the second separator argument can likewise
be any type. The result is list of the various objects. (The example
usage just uses a list of string objects  and separator to illustrate
what it does.)

def tween(seq, sep):
   return reduce(lambda r,v: r+[sep,v], seq[1:], seq[:1])

lst = ['a','b','c','d','e']

print tween(lst, '|')
print ''.join(tween(lst, '|'))

Output:

['a', '|', 'b', '|', 'c', '|', 'd', '|', 'e']
a|b|c|d|e


It could be made a little more memory efficient by applying the
itertools module's islice() generator to the first 'seq' argument
passed to reduce():

def tween(seq, sep):
   return reduce(lambda r,v: r+[sep,v], itertools.islice(seq,1,None),
seq[:1])


This version accepts any iterable, not just a list:

def tween(seq, sep):
it = iter(seq)
try:
first = it.next()
except StopIteration:
return []
return reduce(lambda r, v: r + [sep, v], it, [first])

A further efficiency improvement would be to do the list concatenation
in place to avoid generating O(n) intermediate copies:

def tween(seq, sep):
it = iter(seq)
try:
first = it.next()
except StopIteration:
return []
def add_sep(r, v):
r += [sep, v]
return r
return reduce(add_sep, it, [first])
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,276
Latest member
Sawatmakal

Latest Threads

Top