2009-02-05 3 views
9

В Python (в частности, Python 3.0, но я не думаю, что это важно), как легко написать цикл над последовательностью символов, имеющих последовательные коды символов? Я хочу сделать что-то вроде этого псевдокода:Python: цикл над последовательными символами?

for Ch from 'a' to 'z' inclusive: # 
    f(Ch) 

Примера: как о хорошей «вещей» версии ниже?

def Pangram(Str): 
    ''' Returns True if Str contains the whole alphabet, else False ''' 
    for Ch from 'a' to 'z' inclusive: # 
     M[Ch] = False 
    for J in range(len(Str)): 
     Ch = lower(Str[J]) 
     if 'a' <= Ch <= 'z': 
      M[Ch] = True 
    return reduce(and, M['a'] to M['z'] inclusive) # 

Линии, обозначенные #, являются псевдокодами. Конечно, reduce() - настоящий Python!

Дорогие мастера (особенно старые, серые бородатые волшебники), возможно, вы можете сказать, что моим любимым языком был Паскаль.

ответ

35

У вас есть константа в модуле строки называется ascii_lowercase, попробовать, что из:

>>> from string import ascii_lowercase 

Затем вы можете перебирать символы в этой строке.

>>> for i in ascii_lowercase : 
...  f(i) 

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

>>> def pangram(str) : 
...  return set(ascii_lowercase).issubset(set(str)) 
+0

Я надеюсь, что ваша борода приемлемо ОП :) – llimllib

+0

Если я получаю быть мастером, я буду жить с бородой :) – sykora

+0

You также может использовать <=, чтобы проверить, являются ли наборы подмножествами: set (ascii_lowercase) <= set (str) – Moshe

8

Итерировать константу со всеми необходимыми вам персонажами очень Pythonic. Однако, если вы не хотите ничего импортировать и работаете только в Unicode, используйте встроенные функции ord() и его обратный chr().

for code in range(ord('a'), ord('z') + 1): 
    print chr(code) 
+0

Unicode-версия chr() - unichr() –

+0

Еще одна вещь: если вы хотите, чтобы диапазон был включен, сделайте > >> для кода в диапазоне (ord ('a'), ord ('z') + 1): \t print unichr (код) –

+1

не рекомендуется импортировать из стандарта lib – hop

0

Я хотел бы написать функцию, подобную Питона range

def alpha_range(*args): 
    if len(args) == 1: 
    start, end, step = ord('a'), ord(args[0]), 1 
    elif len(args) == 2: 
    start, end, step = ord(args[0]), ord(args[1]), 1 
    else: 
    start, end, step = ord(args[0]), ord(args[1]), args[2] 
    return (chr(i) for i in xrange(start, end, step)) 
6

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

>>> ascii_lowercase 
'abcdefghijklmnopqrstuvwxyz' 
>>> def pangram(source): 
    return all(c in source for c in ascii_lowercase) 

>>> pangram('hi mom') 
False 
>>> pangram(ascii_lowercase) 
True 

Ограничившись тем, что предлагает Паскаль, вам не хватает того, что предлагает Python.

И ... старайтесь избегать reduce. Это часто приводит к ужасным проблемам с производительностью.


Редактировать. Вот еще одна формулировка; этот реализует множество пересечений.

>>> def pangram(source): 
>>>  notused= [ c for c in ascii_lowercase if c not in source ] 
>>>  return len(notused) == 0 

Этот текст дает вам часть диагностической информации для определения того, какие буквы отсутствуют в кандидате на панграму.

+0

извините, генератор выражений в 2.4 и выше, а не 2.3 – hop

+0

@hop: я не получаю комментарий. Изменение кода выглядит отлично, но комментарий непрозрачен. –

+0

@ s.lott: я написал в комментарии к самому изменению, что GEs работает в 2.3+ – hop

1

Более абстрактный ответ будет что-то вроде:

>>> x="asdf" 
>>> for i in range(len(x)): 
...  print x[i] 
Смежные вопросы