диапазон по символу в питоне - PullRequest
65 голосов
/ 09 августа 2011

Есть ли способ ранжировать персонажей? как то так.

for c in xrange( 'a', 'z' ):
    print c

Я надеюсь, что вы, ребята, можете помочь.

Ответы [ 14 ]

86 голосов
/ 09 августа 2011

Это отличное использование для пользовательского генератора:

Python 2:

def char_range(c1, c2):
    """Generates the characters from `c1` to `c2`, inclusive."""
    for c in xrange(ord(c1), ord(c2)+1):
        yield chr(c)

, то:

for c in char_range('a', 'z'):
    print c

Python 3:

def char_range(c1, c2):
    """Generates the characters from `c1` to `c2`, inclusive."""
    for c in range(ord(c1), ord(c2)+1):
        yield chr(c)

, то:

for c in char_range('a', 'z'):
    print(c)
74 голосов
/ 09 августа 2011
import string
for char in string.ascii_lowercase:
    print char

См. строковые константы , чтобы узнать о других возможностях, включая прописные буквы, цифры, символы, зависящие от локали, которые вы можете объединить, например string.ascii_uppercase + string.ascii_lowercase, если хотите, чтобы все символы были в нескольких наборах.

24 голосов
/ 09 августа 2011

Вы должны преобразовать символы в числа и обратно.

for c in xrange(ord('a'), ord('z')+1):
    print chr(c) # resp. print unicode(c)

Ради красоты и читабельности вы можете обернуть это в генератор:

def character_range(a, b, inclusive=False):
    back = chr
    if isinstance(a,unicode) or isinstance(b,unicode):
        back = unicode
    for c in xrange(ord(a), ord(b) + int(bool(inclusive)))
        yield back(c)

for c in character_range('a', 'z', inclusive=True):
    print(chr(c))

Этот генератор можно вызвать с помощью inclusive=False (по умолчанию), чтобы имитировать обычное поведение Python для исключения конечного элемента, или с inclusive=True (по умолчанию), чтобы включить его. Таким образом, по умолчанию inclusive=False, 'a', 'z' будет охватывать диапазон от a до y, исключая z.

Если любой из a, b является Unicode, он возвращает результат в Unicode, в противном случае он использует chr.

В настоящее время (вероятно) работает только в Py2.

10 голосов
/ 09 августа 2011

Здесь есть и другие хорошие ответы (лично я бы, вероятно, использовал string.lowercase), но для полноты вы можете использовать map () и chr () в нижнем регистре значения ascii:

for c in map(chr, xrange(97, 123)):
   print c
6 голосов
/ 12 декабря 2014

Если у вас короткий фиксированный список символов, просто используйте обработку Python для строк как списков.

for x in 'abcd':
    print x

или

[x for x in 'abcd']
5 голосов
/ 17 ноября 2014
# generating 'a to z' small_chars.
small_chars = [chr(item) for item in range(ord('a'), ord('z')+1)]
# generating 'A to Z' upper chars.
upper_chars = [chr(item).upper() for item in range(ord('a'), ord('z')+1)]
5 голосов
/ 02 октября 2013
for character in map(   chr, xrange( ord('a'), ord('c')+1 )   ):
   print character

отпечатков:

a
b
c
4 голосов
/ 24 июня 2017

Мне нравится подход, который выглядит так:

base64chars = list(chars('AZ', 'az', '09', '++', '//'))

Это, безусловно, может быть реализовано с большим комфортом, но это быстро, легко и очень читабельно.

Python 3

Версия генератора:

def chars(*args):
    for a in args:
        for i in range(ord(a[0]), ord(a[1])+1):
            yield chr(i)

Или, если вам нравятся списки:

def chars(*args):
    return [chr(i) for a in args for i in range(ord(a[0]), ord(a[1])+1)]

Первый урожай:

print(chars('ĀĈ'))
<generator object chars at 0x7efcb4e72308>
print(list(chars('ĀĈ')))
['Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ']

в то время как второй дает:

print(chars('ĀĈ'))
['Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ']

Это действительно удобно:

base64chars = list(chars('AZ', 'az', '09', '++', '//'))
for a in base64chars:
   print(repr(a),end='')
print('')
for a in base64chars:
   print(repr(a),end=' ')
* * 1 022 * 1023 выходов *
'A''B''C''D''E''F''G''H''I''J''K''L''M''N''O''P''Q''R''S''T''U''V''W''X''Y''Z''a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z''0''1''2''3''4''5''6''7''8''9''+''/'
'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '+' '/' 

Почему list()? Без base64chars может стать генератором (в зависимости от выбранной вами реализации) и, следовательно, может использоваться только в самом первом цикле.

Python 2

Подобное может быть заархивировано с помощью Python 2. Но это гораздо сложнее, если вы также хотите поддерживать Unicode. Чтобы побудить вас прекратить использовать Python 2 в пользу Python 3, я не пытаюсь представить здесь решение Python 2;)

Старайтесь избегать Python 2 сегодня для новых проектов. Также попробуйте сначала портировать старые проекты на Python 3, прежде чем расширять их - в конечном итоге это будет стоить усилий!

Правильная обработка Unicode в Python 2 чрезвычайно сложна, и почти невозможно добавить поддержку Unicode в проекты Python 2, если эта поддержка не была встроена с самого начала.

Подсказки, как перенести это в Python 2:

  • Используйте xrange вместо range
  • Создайте 2-ую функцию (unicodes?) Для обработки Unicode:
    • Используйте unichr вместо chr для возврата unicode вместо str
    • Никогда не забывайте подавать unicode строки как args, чтобы ord и индекс массива работали правильно
3 голосов
/ 03 апреля 2016

Вдохновленный верхним постом выше, я придумал это:

map(chr,range(ord('a'),ord('z')+1))                     
0 голосов
/ 05 февраля 2019

У меня была такая же потребность, и я использовал это:

chars = string.ascii_lowercase
range = list(chars)[chars.find('a'):chars.find('k')+1]

Надеюсь, это кому-нибудь поможет

...