从原始输入中计算元音

时间:2012-10-04 02:40:11

标签: python string count

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

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在范围内不断增加。如何在不遇到此问题的情况下更改此代码以检查输入的元音字符串?

6 个答案:

答案 0 :(得分:9)

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

其他一些评论:

in运算符与set一起使用时效率最高,vowels = set(['a','e','i','o','u']) 是一种专门设计用于快速执行“此项目项的一部分X项”操作的数据类型。*

dict

* infor character in my_string: if character in vowels: # ... 也有效,它会检查dict中是否存在密钥。

迭代字符串

字符串是Python中的序列类型,这意味着您不需要花费所有精力来获取长度然后使用索引 - 您可以迭代字符串,然后您将获得每个字符反过来:

E.g:

set()

使用字符串

初始化集合

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

这意味着如果你想要一个 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'

区分大小写

比较字符区分大小写。 'A' in 'aeiou'lowercase_string = input_string.lower() 一样是假的。要解决这个问题,您可以转换输入以匹配您所比较的情况:

{{1}}

答案 1 :(得分: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中是可迭代的。

答案 2 :(得分:2)

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为{ {1}},0True + True + False。这导致使用生成器表达式的一个班轮和总和:

2

对于sum(s in vowels for s in string) 中的每个字符,其内容为',计算string'中有多少字符。

答案 3 :(得分:1)

您可以使用过滤器进行单线

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

答案 4 :(得分:0)

以下是使用sum和生成器的更精简版本:

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

vowels()

答案 5 :(得分:0)

主题选项

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