Преобразование чисел в соответствующие буквы с помощью Python

Мне было интересно, можно ли преобразовать числа в соответствующие им алфавитные значения. Так

1 -> a
2 -> b

Я планировал сделать программу, которая выводит список всех возможных алфавитных комбинаций для заданной пользователем длины.

Смотрите, я знаю, как собрать остальную часть программы, кроме этой! Любая помощь будет замечательной.


person user3556962    schedule 21.04.2014    source источник
comment
Как соотносятся 1 и a?   -  person thefourtheye    schedule 21.04.2014
comment
Что должно быть на выходе, если число равно 27?   -  person thefourtheye    schedule 21.04.2014


Ответы (6)


Большая буква:

chr(ord('@')+number)

1 -> A

2 -> B

...

Маленькая буква:

chr(ord('`')+number)

1 -> a

2 -> b

...

person LinconFive    schedule 25.09.2017
comment
Благодарю вас! Для сопоставления панд для всех остальных я сделал следующее: df['number_col'] = df['number_col'].astype(int).apply(lambda x: chr(ord('`')+x)) - person kevin_theinfinityfund; 05.11.2020

import string
for x, y in zip(range(1, 27), string.ascii_lowercase):
    print(x, y)

or

import string
for x, y in enumerate(string.ascii_lowercase, 1):
    print(x, y)

or

for x, y in ((x + 1, chr(ord('a') + x)) for x in range(26)):
    print(x, y)

Все приведенные выше решения выводят строчные буквы английского алфавита вместе с их положением:

1 a
...
26 z

Вы бы создали словарь для простого доступа к буквам (значениям) по их положению (ключам). Например:

import string
d = dict(enumerate(string.ascii_lowercase, 1))
print(d[3]) # c
person vaultah    schedule 21.04.2014

А словарь?

>>> import string
>>> num2alpha = dict(zip(range(1, 27), string.ascii_lowercase))
>>> num2alpha[2]
b
>>> num2alpha[25]
y

Но не превышайте 26:

>>> num2alpha[27]
KeyError: 27

Но если вы ищете все алфавитные комбинации заданной длины:

>>> import string
>>> from itertools import combinations_with_replacement as cwr
>>> alphabet = string.ascii_lowercase
>>> length = 2
>>> ["".join(comb) for comb in cwr(alphabet, length)]
['aa', 'ab', ..., 'zz']
person wflynny    schedule 21.04.2014

Вы можете использовать chr() для преобразования чисел в символы, но вам нужно использовать более высокая начальная точка, поскольку в таблице ASCII сначала есть несколько других символов.

Используйте ord('a') - 1 в качестве отправной точки:

start = ord('a') - 1
a = chr(start + 1)

Демо:

>>> start = ord('a') - 1
>>> a = chr(start + 1)
>>> a
'a'

Другой альтернативой является использование string.ascii_lowercase константы в качестве последовательности, но вам нужно начать индексирование с нуля:

import string

a = string.ascii_lowercase[0]
person Martijn Pieters    schedule 21.04.2014

Попробуйте dict и некоторую рекурсию:

def Getletterfromindex(self, num):
    #produces a string from numbers so

    #1->a
    #2->b
    #26->z
    #27->aa
    #28->ab
    #52->az
    #53->ba
    #54->bb

    num2alphadict = dict(zip(range(1, 27), string.ascii_lowercase))
    outval = ""
    numloops = (num-1) //26

    if numloops > 0:
        outval = outval + self.Getletterfromindex(numloops)

    remainder = num % 26
    if remainder > 0:
        outval = outval + num2alphadict[remainder]
    else:
        outval = outval + "z"
    return outval
person ben    schedule 02.10.2019

Вот быстрое решение:

# assumes Python 2.7
OFFSET = ord("a") - 1

def letter(num):
    return chr(num + OFFSET)

def letters_sum_to(total):
    for i in xrange(1, min(total, 27)):
        for rem in letters_sum_to(total - i):
            yield [letter(i)] + rem
    if total <= 26:
        yield [letter(total)]

def main():
    for letters in letters_sum_to(8):
        print("".join(letters))

if __name__=="__main__":
    main()

который производит

aaaaaaaa
aaaaaab
aaaaaba
aaaaac
aaaabaa
aaaabb
aaaaca
aaaad
aaabaaa
# etc

Обратите внимание, что общее количество решений, равное N, равно 2**(N-1).

person Hugh Bothwell    schedule 21.04.2014