Custom string joining

Ian Kelly ian.g.kelly at gmail.com
Mon May 9 16:07:40 EDT 2011


On Mon, May 9, 2011 at 1:26 PM, Martineau <ggrp2.20.martineau at dfgh.net> wrote:
> 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])



More information about the Python-list mailing list