为什么in操作符的行为方式不同



这非常适合

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(的起始值,而boolint的一个子类,总是等于零或一。因此,您可以通过以下方式重写计数器:

sum(letter in 'aeiou' for letter in sentence)
sum(map('aeiou'.__contains__, sentence))

('aeiou')等于'aeiou',像这样的括号是多余的。

第二次查看sentence中的字符是否在['aeiou']中。此列表包含一个5个字符的字符串,因此letter in ['aeiou']永远不会返回True

相关内容

  • 没有找到相关文章

最新更新