Feature Proposal: Sequence .join method

Michael Spencer mahs at telcopartners.com
Fri Sep 30 12:38:25 EDT 2005


Terry Reedy wrote:
> "David Murmann" <david.murmann at rwth-aachen.de> wrote in message 
> news:3q3pt9Fd7pklU1 at news.dfncis.de...
> 
>>>def join(sep, seq):
>>>    return reduce(lambda x, y: x + sep + y, seq, type(sep)())
>>
>>damn, i wanted too much. Proper implementation:
>>
>>def join(sep, seq):
>>    if len(seq):
>>        return reduce(lambda x, y: x + sep + y, seq)
>>    return type(sep)()
>>
>>but still short enough
> 
> 
> For general use, this is both too general and not general enough.
> 
> If len(seq) exists then seq is probably reiterable, in which case it may be 
> possible to determine the output length and preallocate to make the process 
> O(n) instead of O(n**2).  I believe str.join does this.  A user written 
> join for lists could also.  A tuple function could make a list first and 
> then tuple(it) at the end.
> 
> If seq is a general (non-empty) iterable, len(seq) may raise an exception 
> even though the reduce would work fine.
> 
> Terry J. Reedy
> 
> 
> 
For the general iterable case, you could have something like this:

  >>> def interleave(sep, iterable):
  ...     it = iter(iterable)
  ...     next = it.next()
  ...     try:
  ...         while 1:
  ...             item = next
  ...             next = it.next()
  ...             yield item
  ...             yield sep
  ...     except StopIteration:
  ...         yield item
  ...
  >>> list(interleave(100,range(10)))
  [0, 100, 1, 100, 2, 100, 3, 100, 4, 100, 5, 100, 6, 100, 7, 100, 8, 100, 9]
  >>>

but I can't think of a use for it ;-)

Michael




More information about the Python-list mailing list