LINQ的Python等价物

LINQ的Python等价物,python,functional-programming,iterator,Python,Functional Programming,Iterator,在C#中,使用LINQ,如果我有en enumerationEnumeratable,我可以执行以下操作: //a:可枚举项是否包含满足lambda的项? bool contains=可枚举的任何(λ); //b:有多少件商品符合lambda标准? int count=可枚举的计数(λ); //c:根据我的自定义比较器,返回一个只包含不同元素的枚举 var distinct=可枚举的。distinct(比较器); //d:返回满足lambda的第一个元素,如果没有,则抛出异常 var元素=可枚举

在C#中,使用LINQ,如果我有en enumeration
Enumeratable
,我可以执行以下操作:

//a:可枚举项是否包含满足lambda的项?
bool contains=可枚举的任何(λ);
//b:有多少件商品符合lambda标准?
int count=可枚举的计数(λ);
//c:根据我的自定义比较器,返回一个只包含不同元素的枚举
var distinct=可枚举的。distinct(比较器);
//d:返回满足lambda的第一个元素,如果没有,则抛出异常
var元素=可枚举的。第一个(lambda);
//e:返回一个包含除以下元素之外的所有元素的可枚举项
//这也在“其他”中,相等由我的比较器定义
var except=可枚举。except(其他,比较器);
我听说Python的语法比C#更简洁(因此效率更高),那么如何使用Python中的iterable实现同样的语法,使用相同数量或更少的代码


注意:如果我不需要(
Any
Count
First
),我不想将iterable具体化到一个列表中。

以下Python行应该与您拥有的行等效(假设代码中的
func
,或
lambda
,返回一个布尔值):

参考资料:

请注意,我将
lambda
重命名为
func
,因为
lambda
是Python中的一个关键字,出于同样的原因,我将
except
重命名为
except


请注意,您也可以使用而不是理解/生成器,但它通常被认为可读性较差。

我们有生成器表达式和各种函数,用于表示iterables上的任意条件

any(some_function(e) for e in iterable)
sum(1 for e in iterable if some_function(e))
set(iterable)
next(iterable)
(e for e in iterable if not comparer(e) in other)

与您使用惯用Python编写示例的方式大致相同。

最初的问题是如何使用Python中的iterables实现相同的功能。虽然我喜欢列表理解,但我仍然发现LINQ在许多情况下更具可读性、直观性和简洁性。以下库包装了Python iterables,以使用相同的LINQ语义在Python中实现相同的功能:


如果您想坚持使用内置Python功能,请提供C#LINQ功能到内置Python命令的相当彻底的映射。

谢谢,您错过了d:enumerable。首先(lambda),您可以添加它吗?@Flavien-添加了它,我还修改了
enumerable.Distinct
等效项。我的原始版本提供了一组比较器结果,而不是使用原始可枚举的值。没有自定义比较器,您可以只使用
distinct=set(可枚举)
性能如何?它是否与.Net等效?
any(some_function(e) for e in iterable)
sum(1 for e in iterable if some_function(e))
set(iterable)
next(iterable)
(e for e in iterable if not comparer(e) in other)