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

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

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

def alphCount(text):
  lowerText = text.lower()
  for letter in allTheLetters:  
    print letter + ":", lowertext.count(letter)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
40
0
67 854
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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

Я думаю, ваша "буква" внутри count () должна быть "chr (letter)"

paxdiablo 23.10.2008 10:37

Поскольку вы исправили это (и у меня не было моей ошибки, которая приводила к проверке только до «y» :-), я удалил свой ответ и проголосовал за ваш.

paxdiablo 23.10.2008 10:40

@ Адам: Я временно проголосовал против, чтобы удалить его из верхней позиции и повысить ответ Мэтью. Это тоже не очень питонический код.

John Millikin 23.10.2008 11:08

@John: ооо, манипулирование рынком. Контролирует ли SEC эти форумы? :-)

paxdiablo 23.10.2008 12:17

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 () выполняет итерацию по строке, чтобы найти счетчик)

Ber 23.10.2008 11:54

Однако на конкретный вопрос был дан ответ. Другие проблемы - это проблема оригинальных плакатов.

paxdiablo 23.10.2008 12:16

или вы можете получить все строчные буквы, выполнив итерацию по следующему списку: allTheLetters = [chr (i + 97) for i in range (26)]

Stefan Gruenwald 22.11.2014 04:57

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

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

Ber 23.10.2008 11:53

Является ли полученный член O (1)? Если это O (n), то все это O (n ^ 2).

paxdiablo 23.10.2008 13:13

@Pax Diablo: сопоставления хешируются. Словарь получает O (1).

S.Lott 24.10.2008 06:08

Главный вопрос - «перебрать алфавит»:

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. Кроме того, это ужасно непифоническое имя для функции!

user3850 24.10.2008 00:39

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

mhawke 24.10.2008 03:16

На самом деле количество символов Unicode все еще меньше миллиона. Также некоторые из них не являются алфавитными, поэтому вы хотите исключить их при распечатке частот.

Windows programmer 24.10.2008 03:36

"string.ascii_lowercase" - я надеюсь, что есть unicode_lowercase для обработки кириллицы, греческого языка и т. д. Я надеюсь, что он знает, как правильно опустить турецкий I в зависимости от текущего языкового стандарта.

Windows programmer 24.10.2008 03:37

Вместо collections.defaultdict (lambda: 0) использование collections.defaultdict (int) будет делать то же самое и более четкое IMO.

Tony Meyer 24.10.2008 14:40

Хорошее решение Glyph, но я не думаю, что ваше окончательное решение решает проблему точно так же. В исходном решении он печатает «a: 0», если в исходной строке не было «a». В этом случае ваша буква «а» будет пропущена, верно?

technomalogical 24.10.2008 22:24

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

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())

Matthew Trevor 12.06.2012 08:29

Это то, что я делаю:

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:]

Другие вопросы по теме