2012-04-08 16 views
6

好奇心が強いのは、 3文字の連続アルファベット順に並んでいるかどうかを判断する最もピーソニックで効率的な方法は何ですか?3文字がアルファベット順に並んでいるかどうかを確認する方法

すぐに&のように見える汚い方法、他の、より良い実装ですか?

私は1つの代替アプローチがコピーに 順序を並べ替えると、元とそれを比較することであるかもしれないと仮定します。いいえ、シーケンスのギャップについては、 は考慮されません。

(これは宿題ではありません - 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

次のステップはチェックする辞書のようです。 [こちら](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

はここで任意のためにそれをチェックするための素敵な神託の方法です長い文字列:

+0

'True'と' False'sのリスト全体を最初に作成するのではなく、 'all'をジェネレータに反復させるために角括弧を削除するように編集しました。 – Acorn

+0

きちんとしています。なぜなら何らかの理由で組み込みのall()関数の前に来ていなかったからです。 – Levon

+0

@Acom - 修正をお願いします。 –

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

+1非常に面白い!そして、正しい答えがここにあります。他のすべての人はアルファベット順のチェックを見逃します。 –

+0

クール - ソリューションのおかげで – Levon

+0

@マークビーズはい、それは=ですが、ここでは解空間は限られており、直接の検索は簡単です – 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 

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

としては、シーケンスは穴が含まれている場合、これは動作しませんようにコメントで指摘し、別のアプローチが

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

このアプローチはすでに質問で言及されています。 –

+0

@ MarkByers:別の解決策で自分の答えを更新しました – Abhijit

+0

まだ間違っています。 'ace'は' True'を返します。そして、 '/'ではなく '/'を使うべきです。この変更がなければ、Python 3ではコードがエラーになります。 –

関連する問題