2008-10-23 74 views
40

作为一个例子,可以说我想列出字符串中每个字母的字母的频率。最简单的方法是什么?如何迭代Python中的字符串?

这是我正在考虑的一个例子......问题是如何使allTheLetters等于没有像allTheLetters =“abcdefg ... xyz”之类的字母。在许多其他语言中,我可以只写字母++,并通过字母递增方式,但到目前为止,我还没有遇到过在python中这样做的方法。

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

回答

72

你问的问题(如何通过迭代字母)并不像你想解决的问题同样的问题(如何计算的字母串的频率)。

您可以使用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'ĺ'] 

如果你试穿的Unicode(通过每个字符递增),你会等待很长一段时间的另一种方法;有数百万个Unicode字符。

要实现你的原始功能(打印按字母顺序排列的每个字母的计数)在此方面:

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

alphCount("hello, world!") 
3

这样的事情?

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

(我不说话了Python,请原谅我的语法错误)

+0

我觉得里面算你的 “信”()应该是“CHR(字母)” – paxdiablo 2008-10-23 06:37:02

+0

既然你固定它(并没有我的off-by-一个错误导致只检查了为“Y” :-),我已经删除了我的回答和upvoted你。 – paxdiablo 2008-10-23 06:40:38

+2

这看起来好像没什么问题,为什么会得到否决? – 2008-10-23 07:05:10

14

的问题是,如何让 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) 
3

你的意思是使用:

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

如果你只想做一个字符串的频率计数,试试这个:

s = 'hi there' 
f = {} 

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

print f 
2

主要问题是 “在字母表迭代”:

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 
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])) 
-1

这是我做的:

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

这个怎么样,使用字母,数字和标点(所有可用以形成一个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)])) 

实施例的结果:酷:!V d + P,& S * hzbO {a0_6] 2 { 4 | OIbVuAbq0:

0

只需使用:

import string 
string.lowercase 
string.uppercase 

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