6

不思議なことに、3文字のシーケンスが連続したアルファ順であるかどうかを判断するための最もPython的で効率的な方法は何ですか?

うまくいくように見える迅速で汚い方法の下で、他のより良い実装?

別のアプローチの1つは、シーケンスのコピーを並べ替えて、元のシーケンスと比較することだと思います。いいえ、それはシーケンスのギャップを説明しません。

(これは宿題ではありません-NPRサンデーモーニングプログラムのリスナーは知っているでしょう)

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
4

5 に答える 5

11

簡単:

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

または、 を使用することもできますstring.find()

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

これを使用した関数は次のようになると思います。

def checkSequence(*letters):
    return ''.join(letters).lower() in ascii_lowercase
于 2012-04-08T16:05:59.310 に答える
5

これは、任意の長い文字列をチェックするための素晴らしいpythonicの方法です。

def consecutive_chars(l):
    return all(ord(l[i+1])-ord(l[i]) == 1 for i in range(len(l)-1))
于 2012-04-08T15:35:43.100 に答える
4
ord('a') < ord(a)+1 == ord(b) == ord(c)-1 < ord('z')
于 2012-04-08T15:38:09.763 に答える
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
>>> 

このように考えてください。文字は、昇順または降順で並べ替えられている場合は連続しています。

シーケンスに穴が含まれている場合、これは機能しないため、コメントで指摘されているように、別のアプローチは次のようになります。

>>> ''.join(x).lower() in string.lowercase
True
>>> 
于 2012-04-08T15:38:30.300 に答える
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"
于 2012-04-08T15:33:00.187 に答える