举个例子,假设我想在字符串中列出字母表中每个字母的频率。最简单的方法是什么?
这是我正在考虑的一个例子......问题是如何使allTheLetters等于所有字母,而不是像allTheLetters =“abcdefg ... xyz”。在许多其他语言中,我可以用字母++来增加字母表中的方式,但到目前为止我还没有遇到过在python中这样做的方法。
def alphCount(text):
lowerText = text.lower()
for letter in allTheLetters:
print letter + ":", lowertext.count(letter)
答案 0 :(得分: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!")
答案 1 :(得分: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)
答案 2 :(得分:9)
如果您只想对字符串进行频率计数,请尝试以下方法:
s = 'hi there'
f = {}
for c in s:
f[c] = f.get(c, 0) + 1
print f
答案 3 :(得分: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]))
答案 4 :(得分:3)
这样的东西?
for letter in range(ord('a'), ord('z') + 1):
print chr(letter) + ":", lowertext.count(chr(letter))
答案 5 :(得分: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 )
答案 6 :(得分: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
答案 7 :(得分: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)]))
示例结果:coOL:V!D + P,& S * hzbO {a0_6] 2!{4 | OIbVuAbq0:
答案 8 :(得分:0)
只需使用:
import string
string.lowercase
string.uppercase
或
string.letters[:26]
string.letters[26:]
答案 9 :(得分:-1)
这就是我的所作所为:
import string
for x in list(string.lowercase):
print x