我想让A和C之间的距离为2,我能想到的是使用ord
ord('C') - ord('A')
#=>2
有更优雅的方法吗?
答案 0 :(得分:4)
那有什么不优雅的?
也许你可以做到
def get_character_distance(character):
return ord(character.upper()) - ord('A')
更好地描述你正在做的事情。
答案 1 :(得分:2)
如果你真的不想使用ord
,你可以按顺序在所有字母的字符串中查找字符的位置 - Python恰好提供了这样一个字符串(或者其中几个包含string
模块中的字符串确实有一个查找字符位置的方法:
>>> string.ascii_uppercase.index('C')
2
但如果效率是一个问题,那么使用ord
会好得多 - 它会在恒定时间内工作,这会进行线性搜索。
答案 2 :(得分:2)
不,那就差不多了。
您可能希望构建一个实际需要的字符查找,而不是依赖于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']
答案 3 :(得分:1)
也许你可以试试:
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")
摇滚!!