Как мне перебрать строку в Python? - PullRequest
40 голосов
/ 23 октября 2008

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

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

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

Ответы [ 10 ]

72 голосов
/ 23 октября 2008

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

Вы можете использовать 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» соответственно.

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

# -*- 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!")
14 голосов
/ 23 октября 2008

вопрос как сделать allTheLetters равны указанным буквам без чего-то вроде allTheLetters = "АБВГДЕЖ ... хуг"

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

import string

allTheLetters = string.ascii_lowercase

def alphCount(text):
  lowerText = text.lower()
  for letter in allTheLetters:  
    print letter + ":", lowertext.count(letter)
9 голосов
/ 23 октября 2008

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

s = 'hi there'
f = {}

for c in s:
        f[c] = f.get(c, 0) + 1

print f
4 голосов
/ 28 декабря 2011

Для подсчета объектов, очевидное решение - это 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]))
3 голосов
/ 23 октября 2008

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

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 )
3 голосов
/ 23 октября 2008

Как то так?

for letter in range(ord('a'), ord('z') + 1):
  print chr(letter) + ":", lowertext.count(chr(letter))
2 голосов
/ 23 октября 2008

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

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
0 голосов
/ 21 февраля 2013

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

import string
string.lowercase  
string.uppercase

или

string.letters[:26]  
string.letters[26:]
0 голосов
/ 08 января 2013

Как насчет этого, чтобы использовать буквы, цифры и знаки препинания (все это можно использовать для формирования ключа 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:

0 голосов
/ 30 мая 2012

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

import string
for x in list(string.lowercase):
    print x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...