Seite 2 von 2

Verfasst: Sonntag 7. Februar 2010, 02:00
von derdon

Code: Alles auswählen

>>> import re
>>> a = "las|6-1-1643-1438-1"
>>> re.search(r'(?:\d+?-?)+', a).group()
'6-1-1643-1438-1'

Verfasst: Sonntag 7. Februar 2010, 12:07
von HWK
Und ohne re:

Code: Alles auswählen

>>> filter(lambda x: x in '1234567890-', 'las|6-1-1643-1438-1')
'6-1-1643-1438-1'
MfG
HWK

Verfasst: Sonntag 7. Februar 2010, 13:05
von numerix
Darii hat geschrieben:Da Python sowieso schon utopisch langsam ist, macht die Geschwindigkeit aber meist sowieso keinen Unterschied.
Widerspruch!

Verfasst: Sonntag 7. Februar 2010, 15:03
von BlackJack
@numerix: Gegen den Teil vor oder nach dem Komma!? :-)

Verfasst: Sonntag 7. Februar 2010, 16:11
von derdon
Ohne lambda :)

Code: Alles auswählen

>>> a = "las|6-1-1643-1438-1"
>>> from operator import contains
>>> from string import digits
>>> from functools import partial
>>> filter(partial(contains, digits+'-'), a)
'6-1-1643-1438-1'

Verfasst: Sonntag 7. Februar 2010, 19:00
von numerix
BlackJack hat geschrieben:@numerix: Gegen den Teil vor oder nach dem Komma!? :-)
Das hatte ich extra offen gelassen ...
Gegen den ersten Teil auf jeden Fall. Der 2. Teil ist mir zu unpräzise, als dass ich mich da festlegen wollte.

Verfasst: Sonntag 7. Februar 2010, 23:05
von bords0
Darii hat geschrieben:reduce hat pro schleifendurchlauf zwangsläufig einen Funktionsaufruf mehr als for. Das macht es zwangsläufig langsamer als for.
Wie bitte? Hast du einen Beleg für die "mehr Funktionsaufrufe"? Ich würde eher sagen, dass die for-Schleife jeden Durchgang einen name lookup mehr machen muss.

Macht man sich mal die Mühe, "a = reduce(f, r)" als for-Schleife zu schreiben, dann kommt da wohl sowas raus wie

Code: Alles auswählen

it = iter(r)
a = next(it)
for b in it:
    a = f(a, b)
Das ist hässlich, nicht schneller, und "leakt" auch noch das b.

Dass reduce in die functools "verbannt" wurde liegt m.W. nicht daran, dass es keine gute Funktionalität hätte, sondern dass es sehr oft unsinnig verwendet wird/wurde, z.B. reduce(lambda x, y: x + y, r).

Verfasst: Dienstag 9. Februar 2010, 13:09
von mit
Danke