所以我正在创建一个函数,它基本上检查过去第0个元素的字符串是否是感叹号,第一个元素是字母'h'。
例如:
>>>f('h!')
True
>>>f('h!!!!!')
True
>>>f('!!!!!')
False
>>>f('!!!h')
False
我想使用列表理解来做到这一点,但我最终使输出成为第一个元素为真值的列表。我的功能如下:
def f(s):
return s[0] == 'h' and [i == '!' for i in s[1:]]
this returns
>>>f('h!!')
[True]
我这样做的方式有什么问题?如果我删除'和'后的括号,则会引发语法错误。
答案 0 :(得分:3)
尝试打印列表理解部分:
print [i == '!' for i in s[1:]]
你会得到一份像
这样的布尔值列表>>> [True, True, True]
因此,如果您要将AND运算符(如果所有元素都是True
返回True
)应用于该列表(以便获得正确的结果),则可以使用{{3}内置函数:
return s[0] == 'h' and all([i == '!' for i in s[1:]])
根据Python文档:
all(iterable):如果iterable的所有元素都为true(或者iterable为空),则返回True。
修改强>
正如@thefourtheye评论的那样,为避免列表创建,您可以将生成器表达式传递给all()
:
return s[0] == 'h' and all(i == '!' for i in s[1:])
答案 1 :(得分:1)
更改为:
s[0] == 'h' and all(i == '!' for i in s[1:])
如果内部生成器表达式的所有元素都返回True,则 all
返回True。
答案 2 :(得分:1)
这可能是最快的方式
def f(s):
return s == "h" + "!" * (len(s) - 1)