Как я могу увеличить символ?


104

Я новичок в Python, пришедший с Java и C. Как я могу увеличить значение символа? В Java или C символы и целые числа практически взаимозаменяемы, и в некоторых циклах для меня очень полезно иметь возможность увеличивать символы и индексировать массивы по символам.

Как я могу это сделать в Python? Достаточно плохо, что у меня нет традиционного цикла for (;;) - есть ли способ добиться того, чего я хочу достичь, не пересматривая всю свою стратегию?


4
Традиционный forцикл: for i in range(50): do_something_with(i). Да ладно, это не так уж и плохо !!
jathanism

@SilentGhost: я делю английский словарь для использования в приложении для Android. Поскольку файл по отдельности слишком велик, я написал сценарий Python, чтобы разделить их на words_aa.txt, words_ab.txt и т.д. Мне нужно было написать второй сценарий для создания файла Java с массивом, содержащим идентификаторы ресурсов сырых файлов каждого файла Word (потому что я ленив), и я не мог придумать лучшего способа сделать это.
Tom R

3
Вы, кажется, ищете что-то вроде[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost

1
@SilentGhost: Это все, что нужно? Если бы только это сказано в инструкции.
Tom R

Ответы:


180

В Python 2.x, просто использовать ordи chrфункцию:

>>> ord('c')
99
>>> ord('c') + 1
100
>>> chr(ord('c') + 1)
'd'
>>> 

Python 3.x делает это более организованным и интересным благодаря четкому различию между байтами и юникодом. По умолчанию «строка» - это Unicode, поэтому все вышесказанное работает ( ordполучает символы Unicode и chrпроизводит их).

Но если вас интересуют байты (например, для обработки некоторого потока двоичных данных), все еще проще:

>>> bstr = bytes('abc', 'utf-8')
>>> bstr
b'abc'
>>> bstr[0]
97
>>> bytes([97, 98, 99])
b'abc'
>>> bytes([bstr[0] + 1, 98, 99])
b'bbc'

5
@Tom R. Не надо! [скучаю по старым временам]. Когда вы пытаетесь быстро чего-то достичь или преобразовать фрагмент кода, может показаться, что концепции и идиомы Python просто мешают вашему прогрессу и вряд ли стоит обучения ... Будьте терпеливы! Вы даже можете обнаружить, что овладение Python улучшит ваш стиль в Java (и C, в меньшей степени).
mjv

работал как шарм. <br> Единственное изменение, которое я бы сделал, это для z, и в этом случае я присвоил "a".
user45949 03

15

"Достаточно плохо не иметь традиционного петлителя for (;;)" ?? Какой?

Ты пытаешься сделать

import string
for c in string.lowercase:
    ...do something with c...

Или, может быть, вы используете string.uppercaseили string.letters?

У Python этого нет, for(;;)потому что часто есть лучшие способы сделать это. В нем также нет математики символов, потому что в этом нет необходимости.


1
+1 за попытку ответить на вопрос, стоящий за вопросом (проблема XY и т. Д.). Если бы я мог, я бы дал тебе больше.
Devin Jeanpierre

Спасибо. Я часто первым спрашиваю "почему?" на подобные вопросы. Но @SilentGhost меня опередил.
S.Lott

3

Я пришел из PHP, где вы можете увеличивать char (от A до B, от Z до AA, от AA до AB и т. Д.) С помощью оператора ++. Я сделал простую функцию, которая делает то же самое в Python. Вы также можете изменить список символов на любые (строчные, прописные и т. Д.), Которые вам нужны.

# Increment char (a -> b, az -> ba)
def inc_char(text, chlist = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
    # Unique and sort
    chlist = ''.join(sorted(set(str(chlist))))
    chlen = len(chlist)
    if not chlen:
        return ''
    text = str(text)
    # Replace all chars but chlist
    text = re.sub('[^' + chlist + ']', '', text)
    if not len(text):
        return chlist[0]
    # Increment
    inc = ''
    over = False
    for i in range(1, len(text)+1):
        lchar = text[-i]
        pos = chlist.find(lchar) + 1
        if pos < chlen:
            inc = chlist[pos] + inc
            over = False
            break
        else:
            inc = chlist[0] + inc
            over = True
    if over:
        inc += chlist[0]
    result = text[0:-len(inc)] + inc
    return result

2

Существует способ увеличить количество символов, используя ascii_lettersfrom stringpackage, который ascii_lettersпредставляет собой строку, содержащую весь английский алфавит, верхний и нижний регистры:

>>> from string import ascii_letters
>>> ascii_letters[ascii_letters.index('a') + 1]
'b'
>>> ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

Также это можно сделать вручную;

>>> letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> letters[letters.index('c') + 1]
'd'

1

Проверьте это: USING FOR LOOP

for a in range(5): x='A' val=chr(ord(x)+a) print(val)
ВЫХОД: ABCBDE


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.