繁体   English   中英

如何在Python中迭代字符串?

[英]How do I iterate through a string in Python?

举个例子,假设我想在字符串中列出字母表中每个字母的频率。 最简单的方法是什么?

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

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

你问的问题(如何迭代字母表)与你试图解决的问题(如何计算字符串中字母的频率)不是同一个问题。

你可以使用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!")

问题是如何使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)

如果您只想进行字符串的频率计数,请尝试以下方法:

s = 'hi there'
f = {}

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

print f

对于计数对象, 显而易见的解决方案是计数器

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

像这样的东西?

for letter in range(ord('a'), ord('z') + 1):
  print chr(letter) + ":", lowertext.count(chr(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 )

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM