6

只是好奇,确定 3 个字符的序列是否为连续的字母顺序的最 Pythonic/最有效的方法是什么?

在似乎可行的快速而肮脏的方式之下,其他更好的实现?

我想另一种方法可能是对序列的副本进行排序并将其与原始序列进行比较。不,这不能解释序列中的间隙。

(这不是家庭作业——NPR Sunday Morning 节目的听众会知道)

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