我不知道从哪里开始。我需要编写一个函数,它将以序数值返回一串数字。所以喜欢
stringConvert('DABC')
会给我'4123'
stringConvert('XPFT')
会给我'4213'
我想也许我可以创建一个字典,并使字符串中的每个字母与整数相关联,但这似乎效率太低,我仍然不知道如何将它们按顺序排列。
答案 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开始,你用它作为起始值而不是0
。 set()
仅为我们提供了唯一的值。
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
模块,尤其是maketrans和translate
有了这些,您的代码可能看起来像
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