什么时候使用过滤器函数而不是列表理解?
When would using the filter function be used instead of a list comprehension?
最近,我了解了一些有关过滤器方法的知识,它是使用列表理解的替代方法。
假设我有这样一个列表:
names = ["Bob", "Billy", "Samuel", "Adam", "Rob"]
现在,我想获得一个包含以字母“B”开头的姓名的列表。我可以通过几种方式解决这个问题。这是一个:
b_starting_names = list(filter(lambda name: name.startswith("B"), names))
这是另一个:
b_starting_names = [name for name in names if name.startswith("B")]
有人可以解释一下列表推导式和过滤功能之间的区别,以及为什么有人可能想要使用其中之一吗?
两者都没有坏处。可以对 map
.
做出类似的评论
我倾向于使用任何感觉更容易阅读的内容。在你的情况下,我会避免使用 lambda,因为它有点冗长,而是使用理解。
如果我已经有一个函数,我会使用 filter
或 map
方法,我可以直接传递给该方法,这比理解更简洁。
比如我写了一个求最大名字长度的程序:
# Using map
longest = max(map(len, names))
# Using generator expression
longest = max(len(name) for name in names))
在上面的示例中,我会选择 map
而不是生成器表达式,但这完全是个人喜好。
最近,我了解了一些有关过滤器方法的知识,它是使用列表理解的替代方法。
假设我有这样一个列表:
names = ["Bob", "Billy", "Samuel", "Adam", "Rob"]
现在,我想获得一个包含以字母“B”开头的姓名的列表。我可以通过几种方式解决这个问题。这是一个:
b_starting_names = list(filter(lambda name: name.startswith("B"), names))
这是另一个:
b_starting_names = [name for name in names if name.startswith("B")]
有人可以解释一下列表推导式和过滤功能之间的区别,以及为什么有人可能想要使用其中之一吗?
两者都没有坏处。可以对 map
.
我倾向于使用任何感觉更容易阅读的内容。在你的情况下,我会避免使用 lambda,因为它有点冗长,而是使用理解。
如果我已经有一个函数,我会使用 filter
或 map
方法,我可以直接传递给该方法,这比理解更简洁。
比如我写了一个求最大名字长度的程序:
# Using map
longest = max(map(len, names))
# Using generator expression
longest = max(len(name) for name in names))
在上面的示例中,我会选择 map
而不是生成器表达式,但这完全是个人喜好。