Получить позицию символа в алфавите

Я на 90% уверен, что для этого есть встроенная функция.

Мне нужно найти позицию символа в алфавите. Итак, символ "b" - это позиция 1 (считая с 0) и т.д. Кто-нибудь знает, как называется функция?

Заранее спасибо!

EDIT: то, что я пытаюсь сделать, это отправить все символы X количество «шагов» обратно в альфа-ставку, поэтому, если у меня есть строка с «привет», это будет «gh», если я отправил ее на один шаг назад . Может быть, есть лучший способ сделать это, какие-нибудь советы?


person qwerty    schedule 08.05.2011    source источник


Ответы (6)


Он называется index. Например,

>>> import string
>>> string.lowercase.index('b')
1
>>> 

Примечание: в Python 3 string.lowercase был переименован в string.ascii_lowercase.

person Senthil Kumaran    schedule 08.05.2011
comment
Благодарю вас! есть ли для этого какая-либо обратная функция, поэтому, если у меня есть индекс символа, я могу получить фактический символ? - person qwerty; 08.05.2011
comment
Просто [] в строке или списке. >>>string.lowercase[2] - person Senthil Kumaran; 08.05.2011
comment
Благодарю вас! Я постоянно получаю сообщение об ошибке, не могли бы вы взглянуть на это? Я новичок в питоне, извините! pastebin.com/h0b95sPg, ошибка: ValueError: подстрока не найдена - person qwerty; 08.05.2011
comment
@qwerty, я не вижу никаких проблем. Он работает правильно. Я думал, вы хотели сделать result += newChar, а он печатает knzcr ne sdws - person Senthil Kumaran; 08.05.2011
comment
Хм, ты прав! Это работает с примером, который я опубликовал (если я изменю его на newChar), но я сам использовал другой текст. Я думаю, что это не работает, потому что мне нужно пропустить все неалфавитные символы, такие как !,. и т. д. Я нашел метод с именем .isalpha(), но он тоже не работает. pastebin.com/McvRTq1t - person qwerty; 08.05.2011
comment
Я только что увидел, что снова потерпел неудачу с newChar, но теперь это не то, что вызывает ошибку. - person qwerty; 08.05.2011
comment
Ошибка в том месте, где он пытался проиндексировать Y. Он не будет присутствовать, потому что это не строчная буква. вместо string.lowercase можно попробовать string.ascii_letters - person Senthil Kumaran; 08.05.2011
comment
Ага, так и получилось! Я использовал text.lower() перед циклом, но, похоже, тогда это не сработало!? Благодарю вас! - person qwerty; 08.05.2011
comment
Мне пришлось использовать print string.index(string.ascii_lowercase, "c") - person Victor S; 25.12.2011
comment
Питон 3: string.ascii_lowercase.index( "R".lower() ) # --> 17 - person handle; 02.08.2016
comment
В этом ответе не упоминается, как это работает; Это называется index ничего не объясняет. string.lowercase и string.ascii_lowercase — это предварительно инициализированные строковые литералы, содержащие строчные буквы в алфавитном порядке, а .index('b') находит индекс входного символа в этой строке. - person pigi5; 06.04.2021

Без импорта

def char_position(letter):
    return ord(letter) - 97

def pos_to_char(pos):
    return chr(pos + 97)
person Jakob Bowyer    schedule 08.05.2011
comment
Это не + или - 96? - person Suraj Kothari; 05.02.2018

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

РЕДАКТИРОВАТЬ: Обновлено для переноса алфавита, чтобы a-1 сопоставлялся с z, а z+1 сопоставлялся с

Например:

my_string  = "zebra"
difference = -1
new_string = ''.join((chr(97+(ord(letter)-97+difference) % 26) for letter in my_string))

Это создаст строку, в которой все символы будут перемещены на одну позицию назад в алфавите ('ydaqz'). Это будет работать только для слов в нижнем регистре.

person Peter Collingridge    schedule 08.05.2011
comment
Круто, я думаю, что это метод, который я пытался запомнить. Это так попадает в закладки! - person qwerty; 08.05.2011
comment
Вы можете заметить, что это не цикл a‹-›z, и аналогично для вариантов верхнего регистра. Предполагая, что qwerty нацелен на какой-то алгоритм ROT, потребуется исправление этого верхнего уровня с помощью операции по модулю (или двух). - person Stigma; 08.05.2011
comment
Это справедливое замечание. Это также будет делать странные вещи с пробелами и знаками препинания. Я предполагаю, что то же самое относится и к принятому ответу. - person Peter Collingridge; 09.05.2011
comment
Я обновил свой ответ, чтобы обернуть алфавит. Я собираюсь предположить, что сначала строка была преобразована в нижний регистр. - person Peter Collingridge; 09.05.2011

# define an alphabet
alfa = "abcdefghijklmnopqrstuvwxyz"

# define reverse lookup dict
rdict = dict([ (x[1],x[0]) for x in enumerate(alfa) ])

print alfa[1] # should print b

print rdict["b"] # should print 1

rdict — это словарь, который создается путем последовательного просмотра алфавита по одному символу за раз. Функция перечисления возвращает кортеж с индексом списка и символом. Мы меняем порядок, создавая новый кортеж с этим кодом: ( x[1], x[0]), а затем превращаем список кортежей в словарь. Поскольку словарь представляет собой структуру данных хеш-таблицы (ключ, значение), теперь мы можем найти индекс любого символа алфавита.

Однако это не то, что вы хотите решить свою проблему, и если это классное задание, вы, вероятно, получите 0 за плагиат, если отправите его. Для кодирования строк сначала создайте ВТОРОЙ алфавит, организованный таким образом, чтобы alfa2[n] был закодированной формой alfa[n]. В вашем примере второй алфавит будет просто сдвинут на два символа, но вы также можете случайным образом перетасовать символы или использовать какой-либо другой шаблон для их упорядочения. Все это будет продолжать работать с другими алфавитами, такими как греческий, кириллица и т. д.

person Michael Dillon    schedule 09.05.2011

Я только начал изучать Python, поэтому понятия не имею, насколько это эффективно по сравнению с другими методами, но это работает. Кроме того, не имеет значения, написан ли текст прописными или строчными буквами, есть ли знаки препинания и т. д.

Если вы хотите изменить все буквы:

from string import maketrans

textin = "abcdefghijklmnopqrstuvwxyz"
textout = "cdefghijklmnopqrstuvwxyzab"
texttrans = maketrans(textin, textout)

text = "qcc, gr umpiq"

print text.translate(texttrans)

Также работает для изменения некоторых символов:

from string import maketrans

textin = "81972"
textout = "Seios"
texttrans = maketrans(textin, textout)

text = "811, 9t w7rk2"

print text.translate(texttrans)
person JamesCraig    schedule 07.11.2016

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

def alphabet(arg, return_lower=True):

    """
        Indexing the english alphabet consisting of 26 letters. 
        Note: zero indexed

            example usage:

                alphabet('a')
                >> 0

                alphabet(25, return_lower=False)
                >> 'Z'

        :param arg: Either type int or type chr specifying the \
                    index of desired letter or ther letter at \
                    the desired index respectivley.
        :param return_lower: If index is passes, returns letter \
                         with corresponding case. Default is \
                         set to True (lower case returned). 
        :returns: integer representing index of passed character \
                    or character at passed index.
    """

    arg = str(arg)
    assert arg.isdigit() or arg.isalpha()

    if arg.isdigit():
        if return_lower:
            return chr(int(arg) + 97).lower()  
        return chr(int(arg) + 97).upper()

    return ord(arg.lower()) - 97
person LJ Brown    schedule 01.12.2018