string manipulation, leerzeichen einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
USER67
User
Beiträge: 14
Registriert: Mittwoch 22. September 2010, 10:58

Tag,

stehe gerade auf dem schlauch mit einer einfachen manipulation.

Code: Alles auswählen


string = "12345678"

..

als output würde ich gerne folgendes haben

12 34 56 78

eigentlich ganz einfach aber ich habe die methode vergessen die es ermöglicht ohne komplexe manipulationen
weiss jemand zufällig welche bzw wie es einfach realisierbar ist?

Mfg
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

>>> s = "12345678"
>>> " ".join(s[i-1:i+1] for i,c in enumerate(s) if i%2)
'12 34 56 78'
USER67
User
Beiträge: 14
Registriert: Mittwoch 22. September 2010, 10:58

hallo

auf die idee wäre ich nie gekommen

danke

Mfg :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Oder...

Code: Alles auswählen

import re; print(re.sub("(..)(?=.)", "\\1 ", s))
Stefan
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Oder...

Code: Alles auswählen

import itertools
si = iter(s)
#Python2:
print ' '.join(map(''.join, itertools.izip_longest(si, si, fillvalue='')))
#Python3:
print(' '.join(map(''.join, itertools.zip_longest(si, si, fillvalue=''))))
Mick
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Findet alle Zahlenpaare und fügt sie mit Leerzeichen zusammen (falls eine Zahl übrig bleibt, wird sie "verschluckt"):

Code: Alles auswählen

' '.join(re.findall('\d{2}', s))
Hier wird bei einer ungeraden Anzahl von Stellen die übriggebliebene Zahl angehangen:

Code: Alles auswählen

' '.join(re.findall('\d{1,2}', s))
Sofern man weitere Zeichen, die keine Zahlen sind, im String hat, sollte man aber wohl den Ansatz von sma verfolgen, weil dort nichts verschluckt werden kann.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Code: Alles auswählen

>>> si = iter(s)
>>> ' '.join(c + next(si) for c in si)
'12 34 56 78'
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@bords0: Deine Lösung gefällt mir gut, sie scheitert aber leider an s = '123456789'. Obwohl -- der OP hat über diesen Fall nichts geschrieben...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn man das ganze als Stream ansieht, könnte man natürlich auch den "`iter()`-Trick" anwenden:

Code: Alles auswählen

>>> from StringIO import StringIO
>>> s = StringIO('123456789')
>>> ' '.join(iter(lambda: s.read(2), ''))
'12 34 56 78 9'
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ähnlich wie pillmuncher, nur ohne iter:

Code: Alles auswählen

print ' '.join(map(''.join, izip_longest(s[::2], s[1::2], fillvalue='')))
the more they change the more they stay the same
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Besonders schön sehen die Lösungen alle nicht aus, geht warscheinlich auch nicht besser.
Aber welche ist die schnellste ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

Ich würde wohl als "einfachste", "lesbarste" Lösung das hier nehmen:

Code: Alles auswählen

In [83]: ' '.join(s[i:i + 2] for i in xrange(0, len(s), 2))
Out[83]: '12 34 56 78'
In einer Funktion verpackt, bei der die 2 ein Argument ist.
Antworten