A と C の間の距離を 2 にしたいのですが、考えられるのはord
ord('C') - ord('A')
#=>2
これを行うよりエレガントな方法はありますか?
それについてエレガントではないのは何ですか?
多分あなたはできる
def get_character_distance(character):
return ord(character.upper()) - ord('A')
あなたがしていることをよりよく説明するために。
本当に を使用したくない場合はord
、すべての文字を順番に並べた文字列で文字の位置を調べることができますstring
.文字列には、文字の位置を見つける方法があります。
>>> string.ascii_uppercase.index('C')
2
しかし、効率が問題になる場合は、 を使用するord
方がはるかに優れています。これは一定の時間で機能し、線形検索を行います。
いいえ、それはそれが得るのと同じくらい良いです。
依存するのではなく、実際に必要な文字のルックアップを作成し、ルックアップでord()
例外を発生させるか、デフォルトの無効な文字を作成することができます...
from string import ascii_uppercase
lookup = dict( (ch, idx) for idx, ch in enumerate(ascii_uppercase) )
print 'distance is', lookup['C'] - lookup['A'] # 2
print 'distance is', abs(lookup['A'] - lookup['C']) # still return 2
print 'distance is', lookup['C'] - lookup['a'] # raises KeyError
print 'distance is', lookup['C'] - lookup.get('a', 0) # effectively returns lookup['C']
多分あなたは試すことができます:
from string import ascii_letters as letters
def distance(char1,char2):
return letters.index(char2) - letters.index(char1)
私はまだord(char2)-ord(char1)
ずっとクールだと思います。
いくつかの技術的な観点:
>>> import timeit
>>> timeit.timeit(stmt='letters.index("C") - letters.index("A")',setup="from string import ascii_letters as letters",number=10000000)
3.5703659057617188
>>> timeit.timeit(stmt='ord("C") - ord("A")',setup="",number=10000000)
0.9403810501098633
結論:ord("C") - ord("A")
ロック!!