从原始输入中计算元音字母数量

3

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

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


3
加一个内循环遍历你的元音字母列表怎么样? - gtgaxiola
@gtgaxiola 我应该如何具体操作呢? - user1679073
6个回答

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 配合使用时效率最高。 set 是一种特别设计用于快速执行 "项目 X 是否是这组项目的一部分" 类型操作的数据类型。*

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

*dict在使用in检查字典中是否存在一个键时也非常高效。

迭代字符串

在Python中,字符串是一个序列类型,这意味着您不需要费心计算长度并使用索引 - 只需迭代字符串,就可以依次获取每个字符:

例如:

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

用字符串初始化一个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' 返回 False,'A' in 'aeiou' 也返回 False。为了解决这个问题,你可以将输入转换为与你要比较的内容的大小写相匹配:

lowercase_string = input_string.lower()

哇,我想这就做到了。谢谢你提供的这一小段信息,它肯定会派上用场。 - user1679073
同意,解释得很清楚!+1 - squiguy

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中,字符串是可迭代的。


1
另外,(吹毛求疵),count += 1 - nneonneo
TIMTOWTDI - 有多种方法可以做到它 :) - squiguy
但是,“做一件事应该有一个——最好只有一个——明显的方法。” - nneonneo
@nneonneo 这是真的,我只是想分享一下我最喜欢的 Perl 习语。 - squiguy
不需要使用 vowels = ["a","e","i","o","u"]vowels = 'aeiou' 就可以了。另外,先将字符串转换为小写。 - Blender
@Blender 我是根据原始代码进行的。我可以更改它。 - squiguy

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操作可以简化内部循环 - 它与此代码完全相同,但它将您的代码逻辑保持在更高级别(想要做什么 vs. 如何做):

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

现在,事实证明Python可以用布尔值(这是s in vowels所给出的)和整数进行数学计算 - True 表示 1False 表示 0,因此 True + True + False 等于 2。这导致可以使用生成器表达式和sum函数编写一行代码:

sum(s in vowels for s in string)

这句话的意思是:“对于给定的字符串string,统计其中有多少个字符出现在vowels中。”

1

你可以使用过滤器来实现一行代码

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

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

0
这是一个更简洁的使用生成器和sum函数的版本:
def vowels():
    string = raw_input("Enter a string: ")
    print sum(1 for x in string if x.lower() in 'aeiou')

vowels()

1
你可以直接对布尔值求和(布尔值是int的子类)- sum(x.lower() in 'aeiou' for x in string) - lvc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接