【问题标题】:Count vowels from raw input从原始输入计算元音
【发布时间】:2012-09-25 00:52:48
【问题描述】:

我有一个作业问题,要求通过原始输入读取字符串并计算字符串中有多少元音。这是我目前所拥有的,但我遇到了一个问题:

def vowels():
    vowels = ["a","e","i","o","u"]
    count = 0
    string = raw_input ("Enter a string: ")
    for i in range(0, len(string)):
        if string[i] == vowels[i]:
            count = count+1
    print count

vowels()

它可以计算元音,但由于if string[i] == vowels[i]:,它只会计算一次元音,因为i 在范围内不断增加。如何更改此代码以检查输入的元音字符串而不遇到此问题?

【问题讨论】:

  • 用一个内部循环遍历你的元音列表怎么样?
  • @gtgaxiola 我该怎么做呢?

标签: python string count


【解决方案1】:

主题选项

Mystring = "The lazy DOG jumped Over"
Usestring = ""
count=0
for i in Mystring:
    if i.lower() in 'aeiou':
        count +=1
        Usestring +='^'
    else:
        Usestring +=' '

print (Mystring+'\n'+Usestring)
print ('Vowels =',count)

The lazy DOG jumped Over
  ^  ^    ^   ^  ^  ^ ^ 
Vowels = 7

【讨论】:

    【解决方案2】:

    in运营商

    您可能希望使用 in 运算符而不是 == 运算符 - in 运算符可让您检查特定项目是否在序列/集合中。

    1 in [1,2,3] # True
    1 in [2,3,4] # False
    'a' in ['a','e','i','o','u'] # True
    'a' in 'aeiou' # Also True
    

    其他一些cmets:

    套装

    in 运算符与 set 一起使用时效率最高,set 是一种专门设计用于快速执行“项目 X 是否属于这组项目”类型的操作的数据类型。*

    vowels = set(['a','e','i','o','u'])
    

    *dicts 对in 也很有效,它检查字典中是否存在键。

    迭代字符串

    字符串是 Python 中的序列类型,这意味着您无需费力获取长度然后使用索引 - 您只需遍历字符串即可获取每个字符反过来:

    例如:

    for character in my_string:
        if character in vowels:
            # ...
    

    用字符串初始化集合

    在上面,您可能已经注意到创建具有预设值的集合(至少在 Python 2.x 中)涉及使用列表。这是因为set() 类型构造函数采用一系列项目。您可能还注意到,在上一节中,我提到字符串是 Python 中的序列——字符序列。

    这意味着如果你想要一个 set 字符,你实际上可以将这些字符的字符串传递给 set() 构造函数 - 你不需要一个列表单字符串。也就是说,下面两行是等价的:

    set_from_string = set('aeiou')
    set_from_list = set(['a','e','i','o','u'])
    

    整洁,对吧? :) 但是请注意,如果您尝试制作一组​​字符串,而不是一组字符,这也会给您带来麻烦。例如,以下两行相同:

    set_with_one_string = set(['cat'])
    set_with_three_characters = set('cat')
    

    前者是一个元素的集合:

    'cat' in set_with_one_string # True
    'c' in set_with_one_string # False
    

    而后者是一个包含三个元素的集合(每个元素一个字符):

    'c' in set_with_three_characters` # True
    'cat' in set_with_three_characters # False
    

    区分大小写

    比较字符区分大小写。 'a' == 'A' 是 False,'A' in 'aeiou' 也是如此。为了解决这个问题,您可以转换您的输入以匹配您要比较的情况:

    lowercase_string = input_string.lower()
    

    【讨论】:

    • 哦,哇,我认为它做到了。感谢您提供的那一点信息,它肯定会派上用场。
    • 同意,很好的解释! +1
    【解决方案3】:
    for i in range(0, len(string)):
        if string[i] == vowels[i]:
    

    这实际上有一个比只计算每个元音一次更微妙的问题 - 它实际上只测试字符串的第一个字母是否正好是a,如果第二个字母正好是e等等......直到你过去第五。它将尝试测试string[5] == vowels[5] - 这会给出错误。

    您不想使用i 来查看vowels,您需要一个嵌套循环,其中包含对vowels 有意义的第二个索引 - 例如,

    for i in range(len(string)):
       for j in range(len(vowels)):
           if string[i] == vowels[j]:
              count += 1
    

    这可以通过意识到,在 Python 中,您很少希望将 索引 迭代到一个序列中来进一步简化 - for 循环知道如何迭代您可以做的所有事情string[0]string[1]等等,给:

    for s in string:
       for v in vowels:
          if s == v:
            count += 1
    

    可以使用列表上的in 操作来简化内部循环 - 它与此代码完全相同,但它使您的代码逻辑处于更高级别(您想要做什么与如何做):

    for s in string:
       if s in vowels:
           count += 1
    

    现在,事实证明 Python 可以用布尔值(这是 s in vowels 给你的)和整数来做数学运算 - True 表现为 1False 表现为 0,所以 True + True + False2。这导致使用生成器表达式和求和的单行:

    sum(s in vowels for s in string)
    

    读作“对于string 中的每个字符,计算vowels 中有多少个字符”。

    【讨论】:

      【解决方案4】:

      这是一个使用 sum 和生成器的更精简的版本:

      def vowels():
          string = raw_input("Enter a string: ")
          print sum(1 for x in string if x.lower() in 'aeiou')
      
      vowels()
      

      【讨论】:

      • 你可以直接对 bool 求和(bool 子类 int)-sum(x.lower() in 'aeiou' for x in string).
      【解决方案5】:

      你可以简化这段代码:

      def vowels():
          vowels = 'aeiou'
          count = 0
          string = raw_input ("Enter a string: ")
          for i in string:
              if i in vowels:
                  count += 1
          print count
      

      字符串在 Python 中是可迭代的。

      【讨论】:

      • 还有,(nitpick),count += 1
      • TIMTOWTDI - 方法不止一种 :)
      • 但是,“应该有一种——最好只有一种——明显的方法。”
      • @nneonneo 这是真的,我只是想我会抛出我最喜欢的 Perl 成语。
      • 无需使用vowels = ["a","e","i","o","u"]vowels = 'aeiou' 工作得很好。另外,首先将您的字符串转换为小写。
      【解决方案6】:

      您可以将过滤器用于单衬里

      print len(filter(lambda ch:ch.lower() in "aeiou","This is a String"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2015-04-27
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        相关资源
        最近更新 更多