2012-04-08 105 views
6

只是好奇,什么是最pythonic /有效的方式来确定如果 序列的3个字符是连续的字母顺序?如何检查3个字符是否是连续的字母顺序

在快速的&下方看起来很肮脏的方法,其他,更好的实现?

我想一种替代方法可能是排序复制 序列,并将其与原来的比较。不,不会在序列中填充 。

(这不是功课 - 听众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 
+2

这是对[原因](http://www.npr.org/2012/04/08/150202658/a-混淆-AT-的音乐巨星)? – eabraham 2012-04-08 15:34:28

+0

似乎下一步是一个字典来检查。试试[this](http://thedatahub.org/dataset/wiktionary/resource/8147edd1-6932-4816-aa88-2fa4fdc60ab5)。 – eabraham 2012-04-08 15:40:26

+0

@eabraham关闭.. :-) – Levon 2012-04-08 15:57:32

回答

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 
+0

这对我来说似乎是最前沿和最简单的解决方案,非常好。 – Levon 2012-04-08 17:41:19

+0

表查找对于正常的数据大小来说总是很方便,很酷 – okm 2012-04-09 00:08:16

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 2012-04-08 17:42:09

5

这里的检查,对任意一个很好的Python的方式长字符序列:

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

编辑删除方括号以使'all'遍历生成器,而不是首先创建完整的'True'和'False'列表。 – Acorn 2012-04-08 16:00:58

+0

整洁..出于某种原因,我没有遇到内置的所有()功能 – Levon 2012-04-08 17:40:13

+0

@Acom - 感谢您的修复。 – 2012-04-08 21:25:58

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

+1非常有趣!这里唯一的答案是正确的。所有其他人都错过了字母检查。 – 2012-04-08 15:41:35

+0

很酷 - 感谢解决方案 – Levon 2012-04-08 17:53:59

+0

@MarkByers是的= =),尽管这里解决方案空间有限并且直接搜索更容易 – okm 2012-04-09 01:43:39

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 
>>> 
+1

这个方法已经在问题中提及过了,正如OP指出的那样,它不起作用。 – 2012-04-08 15:41:05

+0

@MarkByers:我已经用另一个可能的解决方案更新了我的答案 – Abhijit 2012-04-08 15:47:13

+0

尽管如此,仍然是错误的。 'ace'给出'True'。你应该使用''''而不是'/'。没有这种改变,你的代码会在Python 3中出错。 – 2012-04-08 15:52:37

相关问题