Re: Feature Proposal: Sequence .join method
Available news archives: comp.lang.tcl - comp.lang.python - comp.security.firewalls - sci.crypt - comp.lang.php - comp.lang.javascript
Google
 
Web news.hping.org


comp.lang.python archive

Re: Feature Proposal: Sequence .join method

From: Michael Spencer <mahs@telcopartners.com>
Date: Fri Sep 30 2005 - 18:38:25 CEST

Terry Reedy wrote:
> "David Murmann" <david.murmann@rwth-aachen.de> wrote in message
> news:3q3pt9Fd7pklU1@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
Received on Sat Oct 15 04:00:38 2005