2016-09-17 3 views
1

저는 초보자 파이썬 학생이고 간단한 (그러나 지금, 복잡한, 복잡한) 연습을하고 있습니다. 나는 여러 가지 방법으로 시도했지만, 추측을 멈추기로 결정했다. 왜냐하면 그것이 학습의 정상적인 일상이 아니기 때문이다.파이썬 연습 : 마지막 글자/첫 글자

이 목록 주어진의 마지막 문자에서 다른 문자로 시작하는 목록의 첫 번째 단어를 반환하는 것을하는 lastfirst(lst) 함수를 작성 :

나는 다음과 같은 운동을 해결해야 이전 단어. 그러한 단어가 없으면 은 None을 반환합니다.

예 :

lst = ['sole','elmo','orco','alba','asta'] 반환 'alba'

lst = ['sky','you','use','ear','right'] 반환 None

나는 그것을 해결하기 위해 시도하고, 무엇을 내가 가진 것은 이것이다했습니다

lst = ['sole','elmo','orco','alba','asta'] 

def lastfirst(lst): 

    cont = 0 
    d = 1 
    for a in lst[cont:]: 
     for b in lst[d:]:  
      if a[-1] != b[0]: 
       return lst[d] 
      else: 
       cont = cont + 1 
       d = d + 1 

print(lastfirst(lst)) 

문제 내가 감지했습니다 :

프로그램은 첫 번째 단어의 첫 번째 문자와 두 번째 단어의 마지막 문자 또는 첫 번째 단어의 마지막 문자와 두 번째 단어의 첫 번째 문자를 구분하지 않습니다.

PS : 죄송합니다 나는 (파이썬 3) 작동합니다 생각 내 영어 :

+0

'lst [i] [- 1]'은'lst'의 항목 'i'를 얻은 다음 _that_ item의 마지막 항목을 가져옵니다. 그러므로 lst = [ '하늘', '너', '사용', '귀', '오른쪽'] '이면 lst [2]는'사용 '이고 lst [2] [- 1] ''사용 '의 마지막 문자 인''e' '입니다. –

+0

대단히 감사합니다 !! :) – Nutshell93

+0

아래 답변 중 하나가 문제를 해결하면 받아 들여야합니다 (해당 답변 옆에있는 체크 표시를 클릭하십시오). 그것은 두 가지 일을합니다. 모든 사람들이 귀하의 문제가 만족스럽게 해결되었다는 사실을 모든 사람에게 알리고, 도움을 요청한 사람에게 도움을줍니다. 자세한 설명은 [here] (http://meta.stackexchange.com/a/5235)를 참조하십시오. –

답변

2

을 위해 :

lst = ['sole','elmo','orco','alba','asta'] 

def lastfirst(lst): 
    for i in range(len(lst)-1): 
     if lst[i][-1] != lst[i+1][0] : 
      return lst[i+1] 
    return None 
print(lastfirst(lst)) 

가 출력 :

alba 

설명 (수정 필요 귀하의 코드에서) :

  • 우리는 하나의 for 루프에서 수행 할 수있는 두 개의 for 루프를 필요로하지 않습니다.
  • else 문에서 변수 cont이 증가하지만 항상 a 인 동일한 문자열과 비교합니다.

또 다른 입력 :

lst = ['sky','you','use','ear','right'] 

출력 :

None 

그것은 당신을 도울 것입니다 바랍니다.

+0

@PM 2Ring 알고 있지만'C++ '때문에 습관이 있습니다. 어쨌든 나는 .. 업데이트 할 것이다. –

+0

정말 고마워요 !!! – Nutshell93

1

lst에있는 모든 단어를 lst에있는 다른 모든 단어와 비교 테스트해야 할 때 루프는 double for 루프를 사용합니다.하지만 여기서는 원하는 내용이 아닙니다. 우리는 단지 하나의 for 루프가 필요하며 우리는 이전 단어를 저장해야 현재 단어와 비교하여 테스트 할 수 있습니다.이처럼 :

def lastfirst(lst): 
    if not lst: 
     return None 
    prev = lst[0] 
    for word in lst[1:]: 
     if word[0] != prev[-1]: 
      return word 
     prev = word 
    return None 


data = [ 
    ['sole', 'elmo', 'orco', 'alba', 'asta'], 
    ['sky', 'you', 'use', 'ear', 'right'], 
    [], 
    ['help', 'please', 'everybody', 'thanks'], 
] 

for lst in data: 
    print(lastfirst(lst)) 

출력

alba 
None 
None 
thanks 

내 함수는 먼저 우리는 빈리스트를 건네받을 경우

if not lst: 
    return None 

그래서 우리는 즉시 반환한다. 그렇지 않으면, 프로그램이 prev = lst[0]


을 시도 할 때 충돌합니다 여기에 한 줄을 사용하여 테스트를 할 수있는 효율적인 방법입니다.

def lastfirst(lst): 
    return next((v for u, v in zip(lst, lst[1:]) if u[-1] != v[0]), None) 

이 코드는 분명히 더 컴팩트 내 이전 버전보다이며, 조금 빠를 수 있습니다. 그러나 은 특히 파이썬을 처음 접했을 경우입니다. 어떤 사람들은 이와 같은 "one-liners"가 Pythonic이라고 생각하지만 실제로 코드를 가능한 한 읽을 수있게 만드는 것이 Pythonic입니다. :)

+0

"lst의 모든 다른 단어에 대해 lst의 모든 단어를 테스트해야하는 경우 double for 루프를 사용합니다". 너는 조합 같은 것을 의미 했어!? – Nutshell93

+0

@ Nutshell93 : 예, 인접한 단어가 아닌'lst'에서 _every_ 단어 쌍을 사용하여 무언가를하고 싶다면 이중 for 루프를 사용할 수 있습니다. 그러나, itertools 모듈은 하나의 for 루프를 사용하여 다양한 조합과 순열을 생성하는 방법을 가지고있다. –

0

다음은 itertools를 사용하는 솔루션입니다.

먼저 조건이 충족되는 경우 부울 반환하는 함수 정의 : 마지막으로

import itertools 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = itertools.tee(iterable) 
    next(b, None) 
    return itertools.izip(a, b) 

그리고 :

def check_letters(apair): 
"In a pair, check last letter of first entry with first letter of second" 
    return apair[0][-1] == apair[1][0] 

지금 우리가 itertools module 조리법에서 페어 기능을 사용을

lst = ['sole','elmo','orco','alba','asta'] 
lstlast = [item[1] for item in pairwise(lst) if not check_letters(item)] 
# returns ['alba'] 
+0

정말 고마워요 !!!! – Nutshell93

관련 문제