如何迭代Python中的string?

作为一个例子,可以说我想列出string中每个字母的字母的频率。 最简单的方法是什么?

这是我想到的一个例子…问题是如何使allTheLetters等于所说的字母,而不像allTheLetters =“abcdefg … xyz”。 在许多其他语言中,我可以只写字母++,然后按字母顺序递增,但是到目前为止,我还没有碰到过用python做这个的方法。

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

你所问的问题(如何遍历字母表)与你试图解决的问题(如何计算string中字母的频率)不是同一个问题。

您可以使用string.lowercase,正如其他海报所示:

 import string allTheLetters = string.lowercase 

要按照“习惯”的方式来操作,将字母视为数字,可以使用“ord”和“chr”function。 完全没有理由这样做,但也许它接近你实际上想要的东西:

 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上尝试另一种方法(通过每个angular色递增),你会等待很长时间; 有数百万的Unicode字符。

要实现您的原始function(按字母顺序打印每个字母的计数)在这方面:

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

问题是如何使allTheLetters等于说没有像allTheLetters =“abcdefg … xyz”

这实际上是由string模块提供的,它不像你自己手动input;)

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

如果你只是想做一个string的频率计数,试试这个:

 s = 'hi there' f = {} for c in s: f[c] = f.get(c, 0) + 1 print f 

计数对象, 显而易见的解决scheme是计数器

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

你的意思是使用:

 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 ) 

像这样的东西?

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

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

主要问题是“遍历字母表”:

 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 

怎么样,使用字母,数字和标点符号(都可用来形成一个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:] 

这就是我所做的:

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