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如何更改此代码以检查输入的元音字符串而不会遇到此问题?

4

6 回答 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与 a 一起使用时效率最高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_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()
于 2012-10-04T02:44:06.330 回答
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 中是可迭代的。

于 2012-10-04T02:42:48.237 回答
2
for i in range(0, len(string)):
    if string[i] == vowels[i]:

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

您不想使用ito 查看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给你的)和 ints 来做数学运算 -True表现为1, Falseas 0, so True + True + Falseis 2。这导致使用生成器表达式和求和的单行:

sum(s in vowels for s in string)

其内容为“对于 中的每个字符string,计算其中有多少个字符vowels”。

于 2012-10-04T02:56:38.840 回答
1

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

print len(filter(lambda ch:ch.lower() in "aeiou","This is a String"))
于 2012-10-04T02:49:33.873 回答
0

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

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

vowels()
于 2012-10-04T02:53:04.930 回答
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
于 2016-11-01T09:14:07.133 回答