2014-01-15 2 views
0

단어 뒤에 세미콜론이 있는지 확인하려고합니다. 나는 긴 문자열 안에 단어의 위치를 ​​가지고 있으며, 위치가 start of word + length of word 인 문자가 :인지 확인하려고합니다. 이 단어는 문자열의 마지막 단어가 있음을, 그리고 그러므로 나는이 세 가지 아이디어가 IndexException제어 흐름에 assert 사용

을 올릴 것이다 다음 문자를 얻으려고 할 수 있습니다

1) 우리는 말에 있지 있는지 확인을 문자열의 다음이 정상적으로 파이썬 고려하지 무엇

semicolon_pos = pos_word + len(word) # Possible position 
if semicolon_pos < len(long_string) and long_string[semicolon_pos] == ':': 
    # do something... 
else: 
    # do something else 

세미콜론되지 않았는지 확인

2) 예외 처리 세미콜론 전 견인과 세미콜론

semicolon_pos = pos_word + len(word) # Possible position 
try: 
    if long_string[semicolon_pos] == ':': 
     # Do something 
    else: 
     # do something else (which is the same as in the except clause) 

except IndexError: 
    # do something else 

에 대한 평등 추출하고 중첩하는, 조금 이상한 보인다. 그리고 나는 코드 중복

3) 예외 처리 세미콜론 추출 및 주장은 세미콜론

semicolon_pos = pos_word + len(word) # Possible position 
try: 
    assert long_string[semicolon_pos] == ':' 
    # do something 
except (IndexError, AssertionError): 
    # do something else 

구조가 평평이며이 있는지 확인하기 위해를 방지하기 위해 약간의 트릭을 할해야 쉽게 읽을 수 있지만, 예외 사용을 남용하는 느낌이 들었습니다.

파이썬 사용자는 무엇을 말합니까? 사전에 감사합니다.

#considering mylongstring contains the word 
#+1 for the possible colon 
mylongstring[:pos_word + len(word) + 1].endswith(':') 

또는 긴 문자열이 매우 긴 경우, 당신은 너무 많이 복사하지 않습니다 :

mylongstring[pos_word:pos_word + len(word) + 1][-1] == ':' 
+0

나는 덧글을 달았습니다. 나는 나 자신도 편집하고 있었다. 죄송합니다! – bgusach

+2

endswith (':')? – daveoncode

+0

나에게는 매우 파이썬 적으로 보입니다. 코드 리뷰에서 이것을 묻는 것을 고려해보십시오. 중요한 것은 의도가 무엇인지 명확하게하는 것이므로'colon_follows_word' 함수로 그것을 감쌀 수 있습니다. –

답변

1

가장 간단한 방법은 슬라이스를 아래 첨자로 사용하는 것입니다. 조각으로 IndexError를 던지지 마십시오.

semicolon_pos = pos_word + len(word) # Possible position 
if long_string[semicolon_pos:semicolon_pos+1] == ':': 
    # Do something 
else: 
    # do something else 
+0

처음 아이디어를 주었으므로 올바른 아이디어로 표시하겠습니다. 그것은 timeit'ed하고 길이를 확인하고 비교보다 효율적입니다. 감사. – bgusach

2

(string[index] if index < len(string) else None) == ':'

+0

이것은 조각보다 효율적이지 않습니다. – bgusach

1

는 나는 이런 식으로 쉽게 생각 확실히 단언의 오용. 이유 : 코드가 -O 플래그로 실행될 때 어설 션이 실행되지 않습니다.

어설 션을 사용하는 권장 방법은 알고리즘의 실수로 인한 "불가능한"조건 (사후 조건)을 확인하는 것입니다. 선행 조건 및 프로그램 로직의 경우 일반 예외를 사용해야합니다.

+0

얼마나 오래인지 모르겠습니다. 'mylongstring'은 그렇지만, 실제로 길다면 마지막 문자를 확인하기 위해 아주 긴 조각을 꺼낼 수 있습니다. 테스트하려는 한 문자를 추출하는 것이 더 나을 것입니다. – Duncan

+0

평균적인 경우는 그다지 길지는 않지만 가능한 한 효율적이되고 싶습니다. 그 char와 다음 사이의 조각은 나에게 꽤 좋아 보인다. 나는'endswith' 대신에 ':'와 직접 비교할 것입니다. – bgusach

+0

ikaros45 @ 실제로 : [1]에서 : timeit a.endswith 100000 -N (":") 100000 루프 3의 기기 : 100000 A [-n timeit [2] 루프 당 159 NS -1] == ":" 100000 개의 루프, 3 개 중 최고 : 루프 당 78.6 ns – ProfHase85

3

+0

아마도 부분적으로 대답 할지라도 여기에서 배운 것 중 가장 흥미로운 부분 일 것입니다. 감사. – bgusach

관련 문제