试图用列表理解来做这个简单的功能

时间:2014-03-18 05:57:40

标签: python list list-comprehension

所以我正在创建一个函数,它基本上检查过去第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]

我这样做的方式有什么问题?如果我删除'和'后的括号,则会引发语法错误。

3 个答案:

答案 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)