Hallo zusammen
Gibt es eine Art erweitertes split(), welches erlauben würde, ein Argument zu splitten, auch wenn der delimiter nicht bekannt ist. Also, erst würde split() versuchen auf whitespace zu splitten, wenn kein whitespace vorhanden ist, dann auf ':', sonst auf '-' und sonst noch auf '_'. Das wäre die Idee.
Oder muss man das selber programmieren?
Besten Dank für Hinweise.
Erweitertes split()
[url=http://www.proandkon.com]proandkon.com[/url]
@mzh: Das muss man wohl selber implementieren. Vielleicht auch unter Hilfe von `csv.Sniffer`!?
Code: Alles auswählen
def split(s, seps, maxsplit=-1):
for sep in seps:
parts = s.split(sep, maxsplit)
if len(parts) > 1:
return parts
return parts
print split('ab c', [' ', '-', ':'])
print split('ab-c', [' ', '-', ':'])
print split('ab:c', [' ', '-', ':'])
print split('ab!c', [' ', '-', ':'])
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
@jbs: Sowas habe ich auch erst überlegt - ich glaube aber, dass es effizienter ist, nicht "blind" zu splitten, sondern zu prüfen, ob der Delim im String vorkommt:
Falls man in die Verlegenheit kommt, ein paar Millionen Zeichenketten auf diese Weise trennen zu müssen, kann das sicher durchaus mal eine Sekunde ausmachen
Code: Alles auswählen
def splitit(s, seps, maxsplit=-1):
for sep in seps:
if sep in s:
return s.split(sep, maxsplit)
@jbs: Wieso setzt du 'maxsplit = -1'?
Code: Alles auswählen
>>> print 'sdljsf'.split.__doc__
S.split([sep [,maxsplit]]) -> list of strings
Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are removed
from the result.
[url=http://www.proandkon.com]proandkon.com[/url]
Weil das der Standardwert ist und besagt, dass die Zeichenkette an allen Vorkommen des Delimiters aufgetrennt wird. Ist maxsplit >= 0, wird die Zeichenkette nur an den ersten n-Vorkommen des Delimiters aufgetrennt.
Gruß,
brb
Code: Alles auswählen
>>> "1,2,3".split(",",-1)
['1', '2', '3']
>>> "1,2,3".split(",",0)
['1,2,3']
>>> "1,2,3".split(",",1)
['1', '2,3']
brb
aha, ja war nur verwirrt, weil von Standardwert nichts in der __doc__ stand. Ist also einfach eine Stilfrage, ob der explizit mitgegeben wird.
[url=http://www.proandkon.com]proandkon.com[/url]
Code: Alles auswählen
>>> ''.split(maxsplit=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: split() takes no keyword arguments
Ich möchte ja ein ähnliches Interface wie die originalmethode haben und daher gebe ich den Wert immer mit an.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nicht alle in C implementierten Methoden nehmen in CPython Keywordargumente, liegt glaub ich daran dass die Argumente auf C-Ebene keine "Python-Namen" haben.jbs hat geschrieben:Was soll das eigentlich?!Code: Alles auswählen
>>> ''.split(maxsplit=1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: split() takes no keyword arguments
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice