根据序数值将字母串转换为数字?

时间:2015-02-04 13:59:30

标签: python string integer ordinal

我不知道从哪里开始。我需要编写一个函数,它将以序数值返回一串数字。所以喜欢

stringConvert('DABC')

会给我'4123'

stringConvert('XPFT')

会给我'4213'

我想也许我可以创建一个字典,并使字符串中的每个字母与整数相关联,但这似乎效率太低,我仍然不知道如何将它们按顺序排列。

3 个答案:

答案 0 :(得分:2)

您可以使用enumerate() function对输入字符串中的唯一字符进行排序,并将索引应用于每个字母:

def stringConvert(s):
    ordinals = {c: str(ordinal) for ordinal, c in enumerate(sorted(set(s)), 1)}
    return ''.join([ordinals[c] for c in s])

enumerate()的第二个参数是开始计数的整数;因为你的序数从1开始,你用它作为起始值而不是0set()仅为我们提供了唯一的值。

ordinals然后是按字母顺序将字符映射到整数的字典。

演示:

>>> def stringConvert(s):
...     ordinals = {c: str(ordinal) for ordinal, c in enumerate(sorted(set(s)), 1)}
...     return ''.join([ordinals[c] for c in s])
... 
>>> stringConvert('DABC')
'4123'
>>> stringConvert('XPFT')
'4213'

打破这一切:

>>> s = 'XPFT'
>>> set(s)  # unique characters
set(['X', 'F', 'T', 'P'])
>>> sorted(set(s))  # unique characters in sorted order
['F', 'P', 'T', 'X']
>>> list(enumerate(sorted(set(s)), 1))  # unique characters in sorted order with index
[(1, 'F'), (2, 'P'), (3, 'T'), (4, 'X')]
>>> {c: str(ordinal) for ordinal, c in enumerate(sorted(s), 1)}  # character to number
{'P': '2', 'T': '3', 'X': '4', 'F': '1'}

答案 1 :(得分:1)

查看string模块,尤其是maketranstranslate

有了这些,您的代码可能看起来像

def stringConvert(letters):
    return translate(letters, maketrans(''.join(sorted(set(letters))).ljust(9), '123456789'))

并将您的字符串作为变量传递

答案 2 :(得分:1)

您可以创建一个字符转换表并使用translate()字符串方法:

from string import maketrans

TO = ''.join(str(i+1)[0] for i in xrange(256))

def stringConvert(s):
    frm = ''.join(sorted(set(s)))
    return s.translate(maketrans(frm, TO[:len(frm)]))

print stringConvert('DABC')  # --> 4123
print stringConvert('XPFT')  # --> 4213