String in Buchstaben-Paare zerlegen

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
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Dienstag 7. Oktober 2008, 00:46

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?
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 7. Oktober 2008, 01:19

Code: Alles auswählen

In [77]: string = "Rotlichphasen"

In [78]: for i in xrange(len(string)):
    print string[i-1:i+1]
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dienstag 7. Oktober 2008, 01:47

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']
BlackJack

Dienstag 7. Oktober 2008, 07:51

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
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Dienstag 7. Oktober 2008, 08:37

str1442 hat geschrieben:

Code: Alles auswählen

[x + y for x, y in zip(string, string[1:])]
Super, danke.
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Dienstag 7. Oktober 2008, 09:11

__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]
BlackJack

Dienstag 7. Oktober 2008, 09:14

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.
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Dienstag 7. Oktober 2008, 09:17

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)]
;-)
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Dienstag 7. Oktober 2008, 09:45

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?
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Dienstag 7. Oktober 2008, 10:18

__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?
BlackJack

Dienstag 7. Oktober 2008, 10:24

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.
Antworten