1

我想得到A和C之间的距离是2,我能想到的是使用ord

ord('C') - ord('A')

#=>2

有没有更优雅的方法来做到这一点?

4

4 回答 4

4

那有什么不优雅的呢?

也许你可以做

def get_character_distance(character):
  return ord(character.upper()) - ord('A')

更好地描述你在做什么。

于 2012-10-05T10:24:41.647 回答
2

如果您真的不想使用ord,您可以按顺序在所有字母的字符串中查找字符的位置 - Python 恰好在string模块中提供了这样一个字符串(或者其中几个包含不同的东西),并且字符串确实有一种查找字符位置的方法:

>>> string.ascii_uppercase.index('C')
2

但是如果效率是一个问题,那么使用ord会更好 - 它在恒定时间内工作,这会进行线性搜索。

于 2012-10-05T10:31:22.953 回答
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']
于 2012-10-05T10:32:04.170 回答
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")摇滚!!

于 2012-10-05T10:30:48.883 回答