如何迭代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