0

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

stringConvert('DABC')

会给我'4123'

stringConvert('XPFT')

会给我'4213'

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

4

3 回答 3

2

enumerate()您可以使用以下函数对输入字符串中的唯一字符进行排序并为每个字母应用索引:

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

to的第二个参数enumerate()是开始计数的整数;由于您的序数从 1 开始,因此您将其用作起始值而不是0. set()只给我们独特的价值。

ordinalsthen 是将字符映射到整数的字典,按字母顺序排列。

演示:

>>> 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'}
于 2015-02-04T14:01:30.523 回答
1

看看string模块,尤其是maketranstranslate

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

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

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

于 2015-02-04T14:05:26.880 回答
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
于 2015-02-04T14:30:21.880 回答