28

在 C# 中,使用 LINQ,如果我有 enumeration enumerable,我可以这样做:

// a: Does the enumerable contain an item that satisfies the lambda?
bool contains = enumerable.Any(lambda);

// b: How many items satisfy the lambda?
int count = enumerable.Count(lambda);

// c: Return an enumerable that contains only distinct elements according to my custom comparer
var distinct = enumerable.Distinct(comparer);

// d: Return the first element that satisfies the lambda, or throws an exception if none
var element = enumerable.First(lambda);

// e: Returns an enumerable containing all the elements except those
// that are also in 'other', equality being defined by my comparer
var except = enumerable.Except(other, comparer);

我听说 Python 的语法比 C# 更简洁(因此效率更高),那么我如何在 Python 中使用相同数量或更少的代码来实现相同的迭代?

注意:如果我不需要 ( Any, Count, First),我不想将可迭代对象具体化为列表。

4

3 回答 3

16

以下 Python 行应该等同于您所拥有的(假设funclambda在您的代码中返回一个布尔值):

# Any
contains = any(func(x) for x in enumerable)

# Count
count = sum(func(x) for x in enumerable)

# Distinct: since we are using a custom comparer here, we need a loop to keep 
# track of what has been seen already
distinct = []
seen = set()
for x in enumerable:
    comp = comparer(x)
    if not comp in seen:
        seen.add(comp)
        distinct.append(x)

# First
element = next(iter(enumerable))

# Except
except_ = [x for x in enumerable if not comparer(x) in other]

参考:

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

请注意,您也可以使用map()而不是推导式/生成器,但通常认为它的可读性较差。

于 2012-08-20T17:19:49.517 回答
12

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

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

于 2020-01-17T22:13:45.827 回答
6

我们有生成器表达式和各种函数,用于在可迭代对象上表达任意条件。

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 中编写示例的方式。

于 2012-08-20T17:20:07.893 回答