2012-04-08 2 views
6

호기심이 가장 큰 것은 무엇입니까? 3 문자 시퀀스가 ​​연속 알파 순서인지 확인하는 가장 효율적인 방법은 무엇입니까?3 문자가 연속 된 알파 순서인지 확인하는 방법

아래의 빠른 & 아래에서 작동하는 것 같은 더러운 방법, 다른 멋진 구현 방법은 무엇입니까?

대체 방법으로는 시퀀스를 복사하여 원본과 비교하는 것이 좋습니다. 아니, 시퀀스의 틈새에 대해서는 에 해당하지 않습니다.

는 (이 숙제를하지 않습니다 - NPR 일요일 아침 progam 것 알고 청취자)

def checkSequence(n1, n2, n3): 
    """ check for consecutive sequence of 3 """ 
    s = ord('a') 
    e = ord('z') 

# print n1, n2, n3 
    for i in range(s, e+1): 
     if ((n1+1) == n2) and ((n2+1) == n3): 
      return True 

    return False 


def compareSlice(letters): 
    """ grab 3 letters and sent for comparison """ 

    letters = letters.lower() 
    if checkSequence(ord(letters[0]), ord(letters[1]), ord(letters[2])): 
     print '==> seq: %s' % letters 
     return True 

    return False 
+2

이합니다 ([이유] http://www.npr.org/2012/04/08/150202658/a-인가 :

>>> letters = "lmn" >>> ascii_lowercase.find(letters) != -1 True 

내가 좋아 보일 것이를 사용하여 기능을 추측 믹스 - 업 - 더 - 음악 - 페스트)? – eabraham

+0

다음 단계는 확인할 사전입니다. [this] (http://thedatahub.org/dataset/wiktionary/resource/8147edd1-6932-4816-aa88-2fa4fdc60ab5)를 시도하십시오. – eabraham

+0

@eabraham 닫기 .. :-) – Levon

답변

11

쉬운 것입니다.

def checkSequence(*letters): 
    return ''.join(letters).lower() in ascii_lowercase 
+0

이것은 나에게 가장 앞선 간단한 솔루션, 아주 좋은 것 같습니다. – Levon

+0

테이블 조회는 항상 정상적인 데이터 크기에 편리합니다. – okm

1

어떻게 이런 일에 대해 :

l = letters.lower() 
if len(l)>=3 and ord(l[0])+2==ord(l[1])+1==ord(l[2]): print "yes" 
else: print "no" 
+0

감사합니다. 내 접근 방식과도 매우 유사합니다. – Levon

5

여기에 임의에 대한 것을 확인하는 좋은 파이썬 방법입니다 긴 문자 시퀀스 :

def consecutive_chars(l): 
    return all(ord(l[i+1])-ord(l[i]) == 1 for i in range(len(l)-1)) 
+0

'True'와'False's의 전체 목록을 먼저 생성하는 대신 대괄호를 제거하여'all'이 생성기를 반복하도록 수정했습니다. – Acorn

+0

깔끔한 이유는 무엇입니까? – Levon

+0

@Acom - 수정 해 주셔서 감사합니다. –

4
ord('a') < ord(a)+1 == ord(b) == ord(c)-1 < ord('z') 
+0

+1 매우 흥미 롭습니다! 여기있는 유일한 답이 맞습니다. 다른 모든 사람들은 알파벳순으로 확인하지 않습니다. –

+0

시원한 - 해결책 주셔서 감사합니다 – Levon

+0

@MarkByers 그렇습니다 =), 여기에서는 솔루션 공간이 제한되어 있고 직접 검색이 더 쉽습니다. – okm

4

이것은 단순히 이런 식으로 생각

>>> x=['a','b','c'] 
>>> y=['a','c','b'] 
>>> z=['c','b','a'] 
>>> x==sorted(x) or x == sorted(x,reverse=True) 
True 
>>> y==sorted(x) or y == sorted(y,reverse=True) 
False 
>>> z==sorted(x) or z == sorted(z,reverse=True) 
True 
>>> 

으로 수행 할 수있다. 문자가 오름차순 또는 내림차순으로 정렬되는 경우 문자가 연속됩니다.

>>> letters = "Cde" 
>>> from string import ascii_lowercase 
>>> letters.lower() in ascii_lowercase 
True 
>>> letters = "Abg" 
>>> letters.lower() in ascii_lowercase 
False 

또는 하나 string.find()을 사용할 수

바와 같이 순서가 구멍이 포함 된 경우이 작동하지 않습니다로 의견에서 지적, 또 다른 방법은

>>> ''.join(x).lower() in string.lowercase 
True 
>>> 
+1

이 접근법은 이미 질문에서 언급되었으므로 OP가 지적한대로 작동하지 않습니다. –

+0

@ MarkByers : 다른 가능한 해결책으로 내 대답을 업데이트했습니다. – Abhijit

+0

여전히 잘못되었습니다. 'ace'는'True'를 제공합니다. 그리고'/'가 아닌'//'을 사용해야합니다. 코드를 변경하지 않으면 Python 3에서 오류가 발생합니다. –