Как выполнить итерацию строки в Python?
В качестве примера скажем, я хотел бы перечислить частоту каждой буквы алфавита в строке. Каким будет самый простой способ сделать это?
Это пример того, о чем я думаю... вопрос заключается в том, как сделать allTheLetters равным указанным буквам без чего-то вроде allTheLetters = "abcdefg... xyz". На многих других языках я мог просто написать букву ++ и увеличить свой путь через алфавит, но до сих пор я не нашел способ сделать это в python.
def alphCount(text):
lowerText = text.lower()
for letter in allTheLetters:
print letter + ":", lowertext.count(letter)
Ответы
Ответ 1
Вопрос, который вы задали (как выполнить итерацию по алфавиту), - это не тот же вопрос, что и проблема, которую вы пытаетесь решить (как подсчитать частоту букв в строке).
Вы можете использовать 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!")
Ответ 2
возникает вопрос, как сделать allTheLetters, равный указанным буквам без чего-то вроде allTheLetters = "АБВГДЕЖ... хуг"
Фактически это обеспечивается строковым модулем, вам не нужно вручную вручную вводить его;)
import string
allTheLetters = string.ascii_lowercase
def alphCount(text):
lowerText = text.lower()
for letter in allTheLetters:
print letter + ":", lowertext.count(letter)
Ответ 3
Если вы просто хотите задать частоту строк строки, попробуйте следующее:
s = 'hi there'
f = {}
for c in s:
f[c] = f.get(c, 0) + 1
print f
Ответ 4
Для подсчета объектов очевидным решением является Counter
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]))
Ответ 5
Что-то вроде этого?
for letter in range(ord('a'), ord('z') + 1):
print chr(letter) + ":", lowertext.count(chr(letter))
(я не говорю на Python, прошу простить мои синтаксические ошибки)
Ответ 6
Вы имеете в виду использование:
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 )
Ответ 7
Основной вопрос: "итерация по алфавиту":
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
Ответ 8
Как насчет того, чтобы использовать буквы, цифры и пунктуацию (все используемые для создания ключа 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:
Ответ 9
Просто используйте:
import string
string.lowercase
string.uppercase
или
string.letters[:26]
string.letters[26:]
Ответ 10
Это то, что я делаю:
import string
for x in list(string.lowercase):
print x