Seite 1 von 1

String in Buchstaben-Paare zerlegen

Verfasst: Dienstag 7. Oktober 2008, 00:46
von __marcus__

Code: Alles auswählen

string = 'Rotlichtphasen'

for i in range(1,len(string)):
	print string[i-1:i+1]
Ich möchte gerne (wieder) etwas (dazu) lernen. Wie würdet ihr das machen?

Verfasst: Dienstag 7. Oktober 2008, 01:19
von DasIch

Code: Alles auswählen

In [77]: string = "Rotlichphasen"

In [78]: for i in xrange(len(string)):
    print string[i-1:i+1]

Verfasst: Dienstag 7. Oktober 2008, 01:47
von str1442

Code: Alles auswählen

>>> string = "Rotlichphasen"
>>> a = [x + y for x, y in zip(string, string[1:])]
>>> a
['Ro', 'ot', 'tl', 'li', 'ic', 'ch', 'hp', 'ph', 'ha', 'as', 'se', 'en']

Verfasst: Dienstag 7. Oktober 2008, 07:51
von BlackJack
Die obligatorische Lösung mit Funktionen aus den `itertools`:

Code: Alles auswählen

from itertools import izip, tee


def iter_pair_window(iterable):
    a, b = tee(iterable)
    b.next()    # Skip one item.
    return izip(a, b)


def main():
    string = 'Rotlichtphasen'
    for a, b in iter_pair_window(string):
        print a + b

Verfasst: Dienstag 7. Oktober 2008, 08:37
von __marcus__
str1442 hat geschrieben:

Code: Alles auswählen

[x + y for x, y in zip(string, string[1:])]
Super, danke.

Verfasst: Dienstag 7. Oktober 2008, 09:11
von Qubit
__marcus__ hat geschrieben:
str1442 hat geschrieben:

Code: Alles auswählen

[x + y for x, y in zip(string, string[1:])]
Super, danke.
Willst du wirklich die Buchstaben doppelt?
Ansonsten war dein Ansatz doch nicht schlecht(?):

Code: Alles auswählen

s="Rotlichtphasen"
for i in xrange(0,len(s),2):
	print "%s" % s[i:i+2]

Verfasst: Dienstag 7. Oktober 2008, 09:14
von BlackJack
Als Anmerkung: An Deinem originalen Quelltext gibt's eigentlich nichts auszusetzen. Insbesondere wird dort wesentlich weniger Arbeit und Speicher verschwendet als bei den Lösungen von str1442 und mir. Auch Deins kann man als "list comprehension" oder Generatorausdruck schreiben, wenn man möchte:

Code: Alles auswählen

[string[i:i + 2] for i in xrange(len(string) - 1)]
Hier werden nur ``n = len(string) - 1`` neue Zeichenketten erzeugt.

Bei der Lösung mit `zip()` wird erst die Zeichenkette bis auf das erste Byte kopiert, dann werden `n` Tupel mit jeweils zwei Zeichenketten erzeugt, die dann zu einer weiteren Zeichenkette zusammen gefügt werden.

Verfasst: Dienstag 7. Oktober 2008, 09:17
von Qubit
Qubit hat geschrieben:
__marcus__ hat geschrieben:
str1442 hat geschrieben:

Code: Alles auswählen

[x + y for x, y in zip(string, string[1:])]
Super, danke.
Willst du wirklich die Buchstaben doppelt?
Ansonsten war dein Ansatz doch nicht schlecht(?):

Code: Alles auswählen

s="Rotlichtphasen"
for i in xrange(0,len(s),2):
	print "%s" % s[i:i+2]
oder

Code: Alles auswählen

[s[i:i+2] for i in xrange(0,len(s),2)]
;-)

Verfasst: Dienstag 7. Oktober 2008, 09:45
von __marcus__
BlackJack hat geschrieben:Als Anmerkung: An Deinem originalen Quelltext gibt's eigentlich nichts auszusetzen. Insbesondere wird dort wesentlich weniger Arbeit und Speicher verschwendet als bei den Lösungen von str1442 und mir. Auch Deins kann man als "list comprehension" oder Generatorausdruck schreiben, wenn man möchte:

Code: Alles auswählen

[string[i:i + 2] for i in xrange(len(string) - 1)]
Hier werden nur ``n = len(string) - 1`` neue Zeichenketten erzeugt.

Bei der Lösung mit `zip()` wird erst die Zeichenkette bis auf das erste Byte kopiert, dann werden `n` Tupel mit jeweils zwei Zeichenketten erzeugt, die dann zu einer weiteren Zeichenkette zusammen gefügt werden.
Es kommt bei mir natürlich nicht so sehr auf Geschwindigkeit an, dass Nanosekunden wichtig wären. Es ging mehr darum zu sehen, wie man es noch machen könnte, weil ich mich mit zip, reduce + co eher schwer tue.

Hätte denn diese Version die ja vom Aufbau der ursprünglichen doch sehr ähnelt, der gegenüber Vorteile?

Verfasst: Dienstag 7. Oktober 2008, 10:18
von Qubit
__marcus__ hat geschrieben: Hätte denn diese Version die ja vom Aufbau der ursprünglichen doch sehr ähnelt, der gegenüber Vorteile?
Was betrachtest du denn beim Programmieren als "Vorteil" eines Konzepts gegenüber einem anderen?

Verfasst: Dienstag 7. Oktober 2008, 10:24
von BlackJack
Ausser das `xrange()` verwendet wird, würde sagen Nein.

Solange es nicht zu langsam ist oder zu viel Speicher verbraucht und Du die `zip()`-Variante lesbarer findest, ist natürlich auch dagegen nichts ein zu wenden. Ich wollte halt nur Anmerken, dass bei der ursprünglichen Variante, wenn man die Ergebnisse alle in einer Liste sammelt, ca. das Doppelte an an Zeichen in Zeichenketten von ``len(string)`` dazu kommt, während es bei der `zip()`-Variante das 5-fache ist.