这非常适合
def get_count(sentence):
return sum(1 for letter in sentence if letter in ('aeiou'))
但当我将in运算符应用于这样的数组时,它会使失败
# Incorrect answer for "aeiou": 0 should equal 5
def get_count(sentence):
return sum(1 for letter in sentence if letter in ['aeiou'])
在第一个代码段中,('aeiou')
是一个由括号包围的字符串(在这种情况下,括号没有语法功能(。in
应用于字符串,该字符串本身是可迭代的,因此检查letter
是否是该字符串中的字符之一。
在第二个片段中,['aeoiu']
是一个包含单个元素(字符串'aeiou'
(的列表。in
运算符应用于列表,并检查letter
是否是列表中的元素之一。它显然不是(因为letter
是单个字符(,因此这个条件总是计算为False
。
('aeiou')
是一个字符串。您可以使用对此进行验证
>>> x = ('aeiou')
>>> type(x)
<class 'str'>
CCD_ 11是包含一个元素的列表,该元素又是字符串。
>>> x = ['aeiou']
>>> type(x)
<class 'list'>
>>> len(x)
1
>>> type(x[0])
<class 'str'>
当您编写if letter in ('aeiou')
时,这里测试的是字母是否是字符串'aeiou'
的子字符串。但是,当您编写if letter in ['aeiou']
时,您正在测试字母是否是列表中的一个元素,该列表包含一个元素——字符串'aeiou'
,它始终是False
,而letter
是单个字符。
与其说in
的行为不同,不如说语法对初学者来说是出乎意料的。()
是一个空元组。但这是唯一一次圆括号组成元组。在所有其他情况下,分组都需要括号,但逗号构成了元组。
('aeiou')
不是元组。这是一个带有多余括号的字符串。('aeiou',)
是元组,'aeiou',
也是元组- CCD_ 23明确地是具有一个元素的列表
在python中,字母是长度为一的字符串:没有这样的字符对象。
- 在第一种情况下,您要搜索字符串中的每个字母,字符串是一个长度为1的字符串容器,因此您偶尔会找到一个
- 在第二种情况下,您要搜索列表中的每个字母,该列表是一个长度不为1的字符串的容器,因此永远找不到匹配的字母
将第二种情况与list('aeiou')
进行比较。这不是将一个元素的列表作为['aeiou']
,而是创建一个包含输入字符串中所有字母的列表。
无关的有趣事实:sum
默认为0
(int
(的起始值,而bool
是int
的一个子类,总是等于零或一。因此,您可以通过以下方式重写计数器:
sum(letter in 'aeiou' for letter in sentence)
sum(map('aeiou'.__contains__, sentence))
('aeiou')
等于'aeiou'
,像这样的括号是多余的。
第二次查看sentence
中的字符是否在['aeiou']
中。此列表包含一个5个字符的字符串,因此letter in ['aeiou']
永远不会返回True
。