Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';过滤和理解的区别是什么?_Python - Fatal编程技术网

Python 什么';过滤和理解的区别是什么?

Python 什么';过滤和理解的区别是什么?,python,Python,尝试检查哪些单词是字谜 使用这两种方法,它将打印相同的内容: def anagramwordchecker(z,w): if sorted([x for x in w])==sorted([x for x in z]):return True return False def anagramlistchecker(l,w): d={} for x in w: d.update({x:w.count(x)}) l=list(filter(lambda x:anagram

尝试检查哪些单词是字谜

使用这两种方法,它将打印相同的内容:

def anagramwordchecker(z,w):
  if sorted([x for x in w])==sorted([x for x in z]):return True
  return False
def anagramlistchecker(l,w):
  d={}
  for x in w:
    d.update({x:w.count(x)})
  l=list(filter(lambda x:anagramwordchecker(x,w),l))
  return l
print(anagramlistchecker(['bcda', 'abce', 'cbda', 'cbea', 'adcb'],'abcd'))
它将是:

l=[x for x in l if anagramwordchecker(x,w)] 
l=list(filter(lambda x:anagramwordchecker(x,w),l))

那有什么区别?使用过滤器有什么好处吗?原因理解更容易。

如果您打印以下示例的结果,您将知道哪一个更快(注释是我得到的结果)

因此,在您的情况下,列表理解会更快。但是让我们看看下面的例子

timeit.Timer('''[x for x in range(100) if x % 2 == 0]'''         ).timeit(number=100000)
timeit.Timer('''list(filter(lambda x: x % 2 == 0, range(100)))''').timeit(number=100000)

# 0.3664856200000486
# 0.6642515319999802
结果表明,将iterable转换为
列表
需要花费大量时间,
过滤器
比生成器表达式更快。因此,如果您的结果不一定非得是一个
列表
,那么及时返回一个iterable会更好

如中所述

请注意,如果函数不是None,则filter(function,iterable)等价于生成器表达式(iterable if function(item))中的item for item,如果function是None,则filter(function,iterable)等价于生成器表达式(iterable if item中的item for item)

但是列表理解不仅仅是简单的过滤。如果将
filter
提供给解释器,它将知道这是一个
filter
函数。但是,如果给口译员一个列表理解,口译员就不知道它到底是什么。在花了一些时间将列表理解解释为类似于函数的内容之后,它最终将是一个
过滤器
或函数。或者,其他完全不同的东西

filter
具有
not
条件可以执行
filterfalse
的操作。但是,
filterfalse
仍然存在。为什么?<代码>非
运算符不需要应用

没有魔法。人性化的一对多语法基于封装。要使它们成为机器可执行的二进制文件,需要将它们重新封装,这需要时间


如果一个具体的解决方案比一个更一般的解决方案足够的话,那么就选择一个具体的解决方案。不仅在编码方面,通用解决方案通常是为了方便,而不是为了获得最佳结果。

这是否回答了您的问题?这不是答案,你也可以使用外部长定义和理解。尽管如此,我建议添加更多的文本,而不仅仅是代码,以反映你的思维过程。至少对我来说,如果上面的帖子没有帮助的话,你想问什么还不清楚。我们想给你的问题一个很好的答案,但我们需要你更具体。这里有一些很好的经验法则:确保你反映了你的思考过程,并解释了你想写什么。另一个很好的规则是:用代码开始提问,但不解释为什么你现在的代码通常意味着你没有足够详细。那么你想问的是什么时候使用
过滤器
?是的,我想问为什么过滤器有用首先谢谢!如果函数将返回None,那么在filter和comprehension中会发生什么?None将被类型转换为False,并且您将有一个空列表。那么它在comprehension和filter中是相同的吗?我不明白这一点:请注意,如果函数不是None,则filter(function,iterable)等价于生成器表达式(如果函数(item))中iterable中的item,如果函数是None,则等价于生成器表达式(iterable中item的item,如果函数是None)。@Ori如果没有给定函数,则默认情况下将分配
None
。如果没有给出函数,则使用项本身进行决策,因此,
[iterable If item中的item for item]
@Ori I添加了一些测试结果。如果你喜欢它,请你接受并投票给它。。。?
timeit.Timer('''[x for x in range(100) if x % 2 == 0]'''         ).timeit(number=100000)
timeit.Timer('''list(filter(lambda x: x % 2 == 0, range(100)))''').timeit(number=100000)

# 0.3664856200000486
# 0.6642515319999802
timeit.Timer('''[x for x in range(100) if x % 2 == 0]'''   ).timeit(number=100000)
timeit.Timer('''(x for x in range(100) if x % 2 == 0)'''   ).timeit(number=100000)
timeit.Timer('''filter(lambda x: x % 2 == 0, range(100))''').timeit(number=100000)

# 0.5541256509999357
# 0.024836917000016
# 0.017953075000036733