【问题标题】:How do I iterate through a string in Python?如何在 Python 中遍历字符串?
【发布时间】:2010-09-18 17:28:51
【问题描述】:

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

这是我正在考虑的一个例子......问题是如何使 allTheLetters 等于所说的字母,而不需要像 allTheLetters = "abcdefg...xyz" 这样的东西。在许多其他语言中,我可以只使用 letter++ 并在字母表中递增,但到目前为止,我还没有在 python 中找到这样做的方法。

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

【问题讨论】:

    标签: python


    【解决方案1】:

    您提出的问题(如何遍历字母表)与您尝试解决的问题(如何计算字符串中字母的频率)不是同一个问题。

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

    【讨论】:

    • 你真的应该使用 string.ascii_lowercase 而不是自己编写 getAllTheLetters。此外,这是一个可怕的非 Python 函数名称!
    • 你的 letterOccurrances() 函数也会计算空格和标点符号,可能不是故意的。
    • 实际上Unicode字符的数量还不到一百万。还有一些是非字母的,所以你想在打印频率时排除那些。
    • 而不是 collections.defaultdict(lambda: 0),使用 collections.defaultdict(int) 会做同样的事情,而且更清楚 IMO。
    【解决方案2】:

    问题是如何制作 allTheLetters 等于所述字母 没有像 allTheLetters = "abcdefg...xyz"

    其实是string模块提供的,不用自己手动输入;)

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

    【讨论】:

    • 这个解决方案很慢,因为它有嵌套迭代(lowertext.count() 迭代字符串以找到计数)
    • 不过,具体问题已经回答了。其他问题是原始海报问题。
    • 或者您可以通过对以下列表进行迭代来获取所有小写字母:allTheLetters=[chr(i+97) for i in range(26)]
    【解决方案3】:

    如果您只想对字符串进行频率计数,请尝试以下操作:

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

    【讨论】:

    • 这是一个非常好的解决方案,因为它只在给定的字符串上迭代一次,因此是 O(n) 而不是使用嵌套迭代。如果您使用 f = defaultdict(int) 和简单的 f[c]+=1,事件会更好
    • get 成员是 O(1) 吗?如果是 O(n),那么整个事情就是 O(n^2)。
    • @Pax Diablo:映射是散列的。字典获取是 O(1)。
    【解决方案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]))
    

    【讨论】:

    • 更简单的是,您可以将赋值循环替换为:c = Counter(text.lower())
    【解决方案5】:

    你的意思是使用: P>

    import string
    string.ascii_lowercase
    

    然后, P>

    counters = dict()
    for letter in string.ascii_lowercase:
        counters[letter] = lowertext.count(letter)
    

    所有小写字母被占,丢失计数器将具有零值。 P>

    使用生成器:

    counters = 
        dict( (letter,lowertext.count(letter)) for letter in string.ascii_lowercase )
    

    【讨论】:

      【解决方案6】:

      这样的?

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

      【讨论】:

      • 我认为 count() 中的“字母”应该是“chr(letter)”
      • 自从你修复了它(并且没有我的一个错误导致只检查到 'y' :-),我已经删除了我的答案并支持你的。跨度>
      • @Adam:我暂时否决了它以将其从最高位置移除并提升 Matthew 的答案。它也不是非常 Pythonic 的代码。
      • @John:哦,市场操纵。 SEC 是否监控这些论坛? :-)
      【解决方案7】:

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

      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
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          只需使用:

          import string
          string.lowercase  
          string.uppercase
          

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

          【讨论】:

            【解决方案10】:

            这就是我的工作:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-17
              • 1970-01-01
              • 1970-01-01
              • 2022-01-16
              • 1970-01-01
              • 2018-11-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多