2012-04-08 93 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

相關問題