2017-01-29 7 views
3

쌍리스트로 문자열을 매핑 :내가 문자열을 반복하고 각 문자와 다음 다음 중 하나의 쌍을 반환하는 루프를 가지고

>>> word = 'abcdef' 
>>> for i in range(len(word)-1): 
...  print word[i:i+2] 
... 
ab 
bc 
cd 
de 
ef 

것은이지도를 사용하여이 작성 가능/필터 조합 대신? i+2을 사용하는 대신 다음 문자를 얻는 방법을 알아내는 데 문제가 있습니다.

내가 이렇게 함께지도를 두 번 말씀을 전달하는 시도했다 :

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

그러나 나는 캐릭터 라인으로 연결 오류를 방지하는 방법을 확실 해요 및 없음 :

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

그것은뿐만 아니라 Py2 – schwobaseggl

+0

@schwobaseggl에, Py3에서 작동 @GiladGreen - 오 : 좋은 알고 : 나는'파이썬 3.x' 태그를 추가 –

+0

@schwobaseggl를 파이썬 비교적 새로운. 감사. – jonalmeida

답변

3

할 수 있습니다 zip단어단어 [1] 다음 인접한 문자에 가입하도록지도를 사용

을 0
>>> 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'] 

@Chepner에 의해 주석으로 여분의 lambda은 조인 기능을 제거 할 수 있습니다 :

: 또한 zip 기능 목록 - 이해를 사용할 수 있습니다

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

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

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

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

'람다'가 필요 없습니다. ''.join'만으로도 충분합니다. – chepner

+0

@chepner 흠. 권리. 여분의 람다를 추가하는 데 도움이되지 않습니다. :) 지적 해 주셔서 고마워요. – Psidom

+0

나는 지퍼를 사용하기 때문에이 솔루션을 좋아한다. 고맙습니다! – jonalmeida

5

이렇게하면 문제가 해결됩니다.

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

그냥 처음 반복자에 대한 단어의 마지막 요소 무시 (워드 [을 : - 1])은 메모리 효율적이며 그들을 결합하는 목록을 복제 할 필요가 없기 때문에

0

이 좋은 솔루션입니다.

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