2017-01-29 4 views
3

ich eine for-Schleife haben, dass eine Iteration durch einen String und Paare jedes Zeichens zurückgibt und der nächstfolgenden Filterkombination stattdessen? Ich habe ein Problem herauszufinden, wie man das nächste Zeichen bekommt, anstatt i+2 zu verwenden.Zuordnen einer Zeichenfolge in eine Liste von Paaren

Ich habe versucht, zweimal das Wort übergeben sie wie folgt zusammen zur Karte:

>>> word = 'abcdef' 
>>> map(lambda x, y: x+y, word, word[1:]) 

Aber ich bin nicht sicher, wie die Verkettung Fehler mit einem str und keine zu vermeiden:

>>> map(lambda x, y: x+y, word, word[1:]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: cannot concatenate 'str' and 'NoneType' objects 
+0

@GiladGreen Es funktioniert nur in PY3, nicht in Py2 – schwobaseggl

+0

@schwobaseggl - oh :) gut zu wissen :) relativ neuen –

+0

@schwobaseggl ich hinzugefügt, um den 'python-3.x' Tag Python. Vielen Dank. – jonalmeida

Antwort

3

Sie können zipWort und word [1:] und dann Karte verwenden, um benachbarte Buchstaben zu verbinden:

>>> word = 'abcdef' 
>>> map(lambda x: ''.join(x), zip(word, word[1:]))  
# zip function goes as far as the shortest argument, so there is no need to remove the last 
# element from word here    

# ['ab', 'bc', 'cd', 'de', 'ef'] 

Die zusätzlichen lambda kann nur mit der Join-Funktion entfernt werden, wie durch @Chepner kommentiert:

>>> map(''.join, zip(word, word[1:])) 

# ['ab', 'bc', 'cd', 'de', 'ef'] 

Sie auch Liste Verständnis mit der zip Funktion verwenden können:

[x + y for x, y in zip(word, word[1:])] 

# ['ab', 'bc', 'cd', 'de', 'ef'] 
+1

Keine Notwendigkeit für die "Lambda"; '' .join' ist ausreichend. – chepner

+0

@hepner Hmm. Recht. Kann einfach nicht helfen, zusätzliche Lambdas hinzuzufügen. :) Danke für das Aufzeigen. – Psidom

+0

Ich mag diese Lösung wegen der Verwendung von zip. Vielen Dank! – jonalmeida

5

Dies löst Ihr Problem:

list(map(lambda x, y: x+y, word[:-1], word[1:])) 

ignorieren einfach das letzte Element des Wortes zum ersten iterable (word [: - 1])

0

Dies ist eine gute Lösung, weil es speichereffizient ist und keine Liste zu kopieren, sie zu kombinieren.

def last_and_current(iterator): 
    iterator = iter(iterator) 
    last = next(iterator) 
    for current in iterator: 
     yield last, current 
     last = current 

print [l + c for l, c in last_and_current('abcdef')] 
Verwandte Themen