On Apr 2, 4:32 pm, Peter Otten <__pete...@web.de> wrote: > _split = re.compile(r"(\d+)").split > def split(s): > if not s: > return () > parts = _split(s) > parts[1::2] = map(int, parts[1::2]) > if parts[-1] == "": > del parts[-1] > if parts[0] == "": > del parts[0] > return tuple(parts) >
That's certainly faster than a list comprehension (at least on long lists), but it might be a little obscure why the "if not s:" is needed, so unless Thomas has a really long result list, he might want to just keep the list comprehension, which is (IMO) very readable. Alternatively, this is halfway between the previous example and the list comprehension: _split = re.compile(r"(\d+)").split def split(s): parts = _split(s) parts[1::2] = map(int, parts[1::2]) for index in (-1, 0): if parts and parts[index] == "": del parts[index] return tuple(parts) BTW, I just remembered that, although I have often used the fact that split returns alternating non-match/match/.../match/non-match in the past, the last time I did this particular task (of splitting out digits from a string), I didn't make use of that fact. But I wasn't expecting very many splits for this case. FWIW, here's a class I wrote that does this to a string for the express purpose of making sorts work better: http://code.google.com/p/pyeda/source/browse/trunk/kipy/kipy/utility/istring.py Regards, Pat -- http://mail.python.org/mailman/listinfo/python-list