Python equivalents to LINQ
Solution 1
The following Python lines should be equivalent to what you have (assuming func
, or lambda
in your code, returns a Boolean):
# 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]
References:
Note that I renamed lambda
to func
since lambda
is a keyword in Python, and I renamed except
to except_
for the same reason.
Note that you could also use map()
instead of the comprehensions/generators, but it is generally considered less readable.
Solution 2
The original question was how to achieve the same functionality with iterables in Python. As much as I enjoy list comprehensions, I still find LINQ more readable, intuitive and concise in many situations. The following libraries wrap Python iterables to achieve the same functionality in Python with the same LINQ semantics:
If you want to stick with built in Python functionality, this blog post provides a fairly thorough mapping of C# LINQ functionality to built-in Python commands.
Solution 3
We have generator expressions and various functions for expressing arbitrary conditions over 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)
would roughly correspond to how you write your examples in idiomatic Python.
Flavien
Updated on October 27, 2020Comments
-
Flavien over 3 years
In C#, with LINQ, if I have en enumeration
enumerable
, I can do:// 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);
I hear that Python has a more concise syntax than C# (and is therefore more productive), so how do I achieve the same with an iterable in Python, with the same amount of code, or less?
Note: I don't want to materialize the iterable into a list if I don't have to (
Any
,Count
,First
).