どこから始めればよいかわかりません。序数値で数値の文字列を返す関数を作成する必要があります。以下のようなので
stringConvert('DABC')
私にくれるだろう'4123'
stringConvert('XPFT')
私にくれるだろう'4213'
辞書を作成して、文字列の各文字を整数に関連付けることができるのではないかと考えましたが、それは非効率的であり、それらを整理する方法がまだわかりません。
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])
の 2 番目の引数enumerate()
は、カウントを開始する整数です。序数は 1 から始まるので、 ではなくそれを開始値として使用します0
。set()
一意の値のみを提供します。
ordinals
then は、アルファベット順に文字を整数にマッピングする辞書です。
デモ:
>>> 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'}