Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
为什么';t Python';s过滤器(谓词,集合)是否返回集合?_Python_List_Filter_Set_Python 2.x - Fatal编程技术网

为什么';t Python';s过滤器(谓词,集合)是否返回集合?

为什么';t Python';s过滤器(谓词,集合)是否返回集合?,python,list,filter,set,python-2.x,Python,List,Filter,Set,Python 2.x,为什么Python的过滤器设计为如果运行过滤器(my_谓词,some_set),我会得到列表对象返回,而不是集对象返回? 是否存在您不希望结果成为集合的实际情况?您可以进行集合理解 {my_predicate(x) for x in some_set} # mapping {x for x in some_set if my_predicate(x)} # filtering 比如 In [1]: s = set([1,2,3]) In [2]: {x%2 for x in s}

为什么Python的
过滤器
设计为如果运行
过滤器(my_谓词,some_set)
,我会得到
列表
对象返回,而不是
对象返回?

是否存在您不希望结果成为
集合的实际情况?

您可以进行集合理解

{my_predicate(x) for x in some_set}      # mapping
{x for x in some_set if my_predicate(x)} # filtering
比如

In [1]: s = set([1,2,3])

In [2]: {x%2 for x in s}
Out[2]: {0, 1}
>>> type_preserving_filter(lambda x: x > 3, set([1,2,3,4,5,6,7,7]))
{4, 5, 6, 7}
>>> type_preserving_filter(lambda x: x > 3, list([1,2,3,4,5,6,7,7]))
[4, 5, 6, 7, 7]
>>> type_preserving_filter(lambda x: x > 3, tuple([1,2,3,4,5,6,7,7]))
(4, 5, 6, 7, 7)
Python2中的许多“函数”函数都是标准化的,将
list
作为输出类型。这在很久以前只是一个API选择。在
itertools
中,许多相同的“功能性”函数标准化地提供了一个生成器,您可以从中填充所需的任何数据结构。在Python3中,它们在提供迭代器方面是标准化的

但请注意,Python中的“过滤”与其他一些语言中的“过滤”不同,比如Haskell。它不被认为是数据结构上下文中的转换,您也不会选择通过使数据结构成为Functor的实例(或其他语言中存在的任何类似想法)来“赋予”数据结构“可过滤性”

因此,Python中的一个常见用例是这样说:“这里有一个集合,但我只想返回所有小于5的值。在这一点之后,我不关心它们的‘集合性’,因为我只想对它们做一些其他的工作,所以给我一个__;。”不必为保存这些值最初存在的上下文而发狂

在动态类型文化中,这是非常合理的。但是在静态类型文化中,在转换期间保留类型可能很重要,这将有点令人沮丧。从Python的特定角度来看,这实际上是一种启发

如果它实际上只是在
集合
元组
的一个非常狭窄的上下文中,那么我可以编写一个helper函数:

def type_preserving_filter(predicate, data):
    return type(data)(filter(predicate, data))
比如

In [1]: s = set([1,2,3])

In [2]: {x%2 for x in s}
Out[2]: {0, 1}
>>> type_preserving_filter(lambda x: x > 3, set([1,2,3,4,5,6,7,7]))
{4, 5, 6, 7}
>>> type_preserving_filter(lambda x: x > 3, list([1,2,3,4,5,6,7,7]))
[4, 5, 6, 7, 7]
>>> type_preserving_filter(lambda x: x > 3, tuple([1,2,3,4,5,6,7,7]))
(4, 5, 6, 7, 7)

在Python2.10和Python3.4中都可以使用。在Python 2中,这感觉有点浪费;在Python 3中从迭代器构造更好。

这不仅限于
filter()
。但是Python 3中的API发生了变化,其中
filter()
现在返回一个迭代器而不是列表。引用python文档:

一些著名的API不再返回列表:

  • map()
    filter()
    返回迭代器。如果你真的需要一个列表,一个快速修复方法就是。
    列表(映射(…)
    ,但更好的修复方法通常是使用列表 理解(特别是当原始代码使用lambda时),或 重写代码,使其完全不需要列表。尤其 棘手的是调用
    map()
    以获得函数的副作用;这个 正确的转换是使用常规for循环(因为创建 这张单子简直是浪费)
Python作者撰写的这篇文章详细介绍了在Python3中删除
filter()
的原因(但正如您在上面看到的,这并没有发生,尽管推理仍然很重要)

我认为删除
filter()
map()
是没有争议的;
filter(P,S)
几乎总是写得更清楚,因为
[x代表S中的x,如果P(x)]
,这具有最常见用法的巨大优势 涉及作为比较的谓词,例如
x==42
,并定义 lambda对于读者来说只需要付出更多的努力(加上 lambda比列表速度慢)。对我来说更是如此
map(F,S)
它变成了
[F(x)表示S中的x]
。当然,在很多方面 例如,您可以使用生成器表达式


谁在乎呢?使用理解。过滤器已折旧。@JohnColeman:Filter未被弃用。请参阅:@JohnColeman:yes,大约十年前,Guido想删除它们(以及lambda)。社区与他进行了激烈的斗争,他不得不放弃。这不是反对。@JohnColeman:我当然关心,这就足够让我想知道这个问题的答案了。
filter
只返回Python 2中的列表。与
map
相同。