В качестве примера, допустим, я хотел указать частоту каждой буквы алфавита в строке. Как это сделать проще всего?
Это пример того, о чем я думаю ... вопрос в том, как сделать allTheLetters равными указанным буквам без чего-то вроде allTheLetters = "abcdefg ... xyz". Во многих других языках я мог просто ввести букву ++ и увеличивать свой путь по алфавиту, но до сих пор я не нашел способа сделать это в python.
def alphCount(text):
lowerText = text.lower()
for letter in allTheLetters:
print letter + ":", lowertext.count(letter)
Что-то вроде этого?
for letter in range(ord('a'), ord('z') + 1):
print chr(letter) + ":", lowertext.count(chr(letter))
Поскольку вы исправили это (и у меня не было моей ошибки, которая приводила к проверке только до «y» :-), я удалил свой ответ и проголосовал за ваш.
@ Адам: Я временно проголосовал против, чтобы удалить его из верхней позиции и повысить ответ Мэтью. Это тоже не очень питонический код.
@John: ооо, манипулирование рынком. Контролирует ли SEC эти форумы? :-)
the question is how to make allTheLetters equal to said letters without something like allTheLetters = "abcdefg...xyz"
Это на самом деле обеспечивается строковым модулем, не похоже, что вам нужно вручную вводить его самостоятельно;)
import string
allTheLetters = string.ascii_lowercase
def alphCount(text):
lowerText = text.lower()
for letter in allTheLetters:
print letter + ":", lowertext.count(letter)
Это решение медленное, так как оно имеет вложенные итерации (lowertext.count () выполняет итерацию по строке, чтобы найти счетчик)
Однако на конкретный вопрос был дан ответ. Другие проблемы - это проблема оригинальных плакатов.
или вы можете получить все строчные буквы, выполнив итерацию по следующему списку: allTheLetters = [chr (i + 97) for i in range (26)]
Вы имеете в виду использование:
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 )
Если вы просто хотите подсчитать частоту строки, попробуйте следующее:
s = 'hi there'
f = {}
for c in s:
f[c] = f.get(c, 0) + 1
print f
Это очень удачное решение, поскольку оно повторяется только один раз по заданной строке и, следовательно, составляет O (n), в отличие от использования вложенных итераций. событие лучше, если вы используете f = defaultdict (int) и просто f [c] + = 1
Является ли полученный член O (1)? Если это O (n), то все это O (n ^ 2).
@Pax Diablo: сопоставления хешируются. Словарь получает O (1).
Главный вопрос - «перебрать алфавит»:
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
Заданный вами вопрос (как перебирать алфавит) - это не тот же вопрос, что и проблема, которую вы пытаетесь решить (как подсчитать частоту букв в строке).
Вы можете использовать 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!")
вам действительно следует использовать string.ascii_lowercase вместо написания собственного getAllTheLetters. Кроме того, это ужасно непифоническое имя для функции!
Ваша функция letterOccurrances () также будет подсчитывать пробелы и знаки препинания, возможно, не намеренно.
На самом деле количество символов Unicode все еще меньше миллиона. Также некоторые из них не являются алфавитными, поэтому вы хотите исключить их при распечатке частот.
"string.ascii_lowercase" - я надеюсь, что есть unicode_lowercase для обработки кириллицы, греческого языка и т. д. Я надеюсь, что он знает, как правильно опустить турецкий I в зависимости от текущего языкового стандарта.
Вместо collections.defaultdict (lambda: 0) использование collections.defaultdict (int) будет делать то же самое и более четкое IMO.
Хорошее решение Glyph, но я не думаю, что ваше окончательное решение решает проблему точно так же. В исходном решении он печатает «a: 0», если в исходной строке не было «a». В этом случае ваша буква «а» будет пропущена, верно?
Для подсчета объектов решением очевидный является Прилавок
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]))
Еще проще, вы можете заменить цикл присваивания на: c = Counter(text.lower())
Это то, что я делаю:
import string
for x in list(string.lowercase):
print x
Как насчет этого, чтобы использовать буквы, цифры и знаки препинания (все можно использовать для создания ключа 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:]
Я думаю, ваша "буква" внутри count () должна быть "chr (letter)"