Як я можу збільшити чарочку?


103

Я новачок у Python, що приїжджає з Java та C. Як я можу збільшити char? У Java або C символи та ints практично взаємозамінні, і в певних циклах мені дуже корисно мати змогу робити збільшення кроків та індексувати масиви за допомогою символів.

Як я можу це зробити в Python? Досить погано, що не маю традиційного для (;;) петля - чи є якийсь спосіб я досягти того, чого хочу досягти, не потребуючи переосмислювати всю свою стратегію?


4
Традиційний forцикл: for i in range(50): do_something_with(i). Давай, це не так вже й погано !!
ятанізм

@SilentGhost: Я розбиваю словник англійської мови для використання в додатку для Android. Оскільки файл окремо занадто великий, я написав сценарій Python, щоб розділити їх на word_aa.txt, words_ab.txt і т. Д. ... Мені потрібно було написати другий скрипт для створення файлу Java з масивом, що містить ідентифікатори ресурсних файлів кожного файлового слова (бо я лінивий), і я не міг придумати кращого способу зробити це.
Том Р

3
ви, здається, шукаєте щось на кшталт[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost

1
@SilentGhost: Це все, що потрібно? Якби тільки сказано в посібнику.
Том R

Відповіді:


179

У Python 2.x просто використовуйте функції ordта chr:

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

Python 3.x робить це більш організованим та цікавішим, завдяки чіткому розмежуванню між байтами та unicode. За замовчуванням "рядок" є 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 (та в меншій мірі).
mjv

працював як шарм. <br> Єдина зміна, яку я б зробив, - це z, і в такому випадку я призначив 'a'.
user45949

15

"досить погано, що не маємо традиційного для (;;) петля" ?? Що?

Ви намагаєтесь зробити

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

Або, можливо, ви використовуєте string.uppercaseабо string.letters?

У Python немає, for(;;)тому що часто є кращі способи зробити це. Він також не має математики символів, тому що це також не потрібно.


1
+1 за спробу відповісти на запитання (проблема XY тощо). Якби я міг, я дав би вам більше.
Девін Жанп'єр

Дякую. Я часто спочатку запитую "чому?" для таких питань. Але @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_lettersз stringпакета , який 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

Перевірте це: ВИКОРИСТАННЯ ДЛЯ 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.