Как выполнить итерацию строки в Python?

В качестве примера скажем, я хотел бы перечислить частоту каждой буквы алфавита в строке. Каким будет самый простой способ сделать это?

Это пример того, о чем я думаю … вопрос в том, как сделать allTheLetters равным указанным буквам без чего-то вроде allTheLetters = "abcdefg … xyz". На многих других языках я мог просто писать букву ++ и увеличивать свой путь через алфавит, но до сих пор я не нашел способа сделать это в python.

def alphCount(text): lowerText = text.lower() for letter in allTheLetters: print letter + ":", lowertext.count(letter) 

Вопрос, который вы задали (как выполнить итерацию по алфавиту), – это не тот же вопрос, что и проблема, которую вы пытаетесь решить (как подсчитать частоту букв в строке).

Вы можете использовать string.lowercase, как предложили другие плакаты:

 import string allTheLetters = string.lowercase 

Чтобы делать то, что вы привыкли, рассматривая буквы как цифры, вы можете использовать функции «ord» и «chr». Нет абсолютно никаких оснований делать это, но, возможно, оно приближается к тому, что вы на самом деле пытаетесь выяснить:

 def getAllTheLetters(begin='a', end='z'): beginNum = ord(begin) endNum = ord(end) for number in xrange(beginNum, endNum+1): yield chr(number) 

Вы можете сказать, что это правильно, потому что этот код печатает True :

 import string print ''.join(getAllTheLetters()) == string.lowercase 

Но, чтобы решить проблему, которую вы на самом деле пытаетесь решить, вы хотите использовать словарь и собирать буквы, как вы идете:

 from collections import defaultdict def letterOccurrances(string): frequencies = defaultdict(lambda: 0) for character in string: frequencies[character.lower()] += 1 return frequencies 

Используйте так:

 occs = letterOccurrances("Hello, world!") print occs['l'] print occs['h'] 

Это напечатает «3» и «1» соответственно.

Обратите внимание, что это работает и для юникода:

 # -*- coding: utf-8 -*- occs = letterOccurrances(u"héĺĺó, ẃóŕĺd!") print occs[u'l'] print occs[u'ĺ'] 

Если бы вы попытались использовать другой подход в юникоде (увеличивая каждый символ), вы бы долго ждали; есть миллионы символов Юникода.

Чтобы реализовать свою оригинальную функцию (напечатайте подсчеты каждой буквы в алфавитном порядке) в терминах этого:

 def alphCount(text): for character, count in sorted(letterOccurrances(text).iteritems()): print "%s: %s" % (character, count) alphCount("hello, world!") 

вопрос в том, как сделать allTheLetters равным указанным буквам без чего-то вроде allTheLetters = "abcdefg … xyz"

Это фактически обеспечивается строковым модулем, это не похоже на то, что вы должны вручную вводить его самостоятельно;)

 import string allTheLetters = string.ascii_lowercase def alphCount(text): lowerText = text.lower() for letter in allTheLetters: print letter + ":", lowertext.count(letter) 

Если вы хотите просто подсчитать частоту строки, попробуйте следующее:

 s = 'hi there' f = {} for c in s: f[c] = f.get(c, 0) + 1 print f 

Для подсчета объектов очевидным решением является счетчик

 from collections import Counter import string c = Counter() for letter in text.lower(): c[letter] += 1 for letter in string.lowercase: print("%s: %d" % (letter, c[letter])) 

Вы имеете в виду использование:

 import string string.ascii_lowercase 

тогда,

 counters = dict() for letter in string.ascii_lowercase: counters[letter] = lowertext.count(letter) 

Будут учитываться все строчные буквы, отсутствующие счетчики будут иметь нулевое значение.

используя генераторы:

 counters = dict( (letter,lowertext.count(letter)) for letter in string.ascii_lowercase ) 

Что-то вроде этого?

 for letter in range(ord('a'), ord('z') + 1): print chr(letter) + ":", lowertext.count(chr(letter)) 

(Я не говорю на Python, пожалуйста, простите мои синтаксические ошибки)

Главный вопрос – «итерация по алфавиту»:

 import string for c in string.lowercase: print c 

Как получить частоту букв с некоторой эффективностью и без учета небуквенных символов:

 import string sample = "Hello there, this is a test!" letter_freq = dict((c,0) for c in string.lowercase) for c in [c for c in sample.lower() if c.isalpha()]: letter_freq[c] += 1 print letter_freq 

Как насчет этого, использовать буквы, цифры и знаки препинания (все, что можно использовать для создания ключа Django):

 import random import string chars = string.letters + string.digits + string.punctuation chars_len = len(chars) n = 40 print(''.join([chars[random.randint(0, chars_len)] for i in range(n)])) 

Пример результата: coOL: V! D + P, & S * hzbO {a0_6] 2! {4 | OIbVuAbq0:

Просто используйте:

 import string string.lowercase string.uppercase 

или

 string.letters[:26] string.letters[26:] 

Вот что я делаю:

 import string for x in list(string.lowercase): print x