You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
Extends python's list builtin with fun, robust functionality - .NET's Language Integrated Queries (Linq) and more. Write clean code with powerful syntax.
pip install linqit
Stop using loops, complex conditions, list comprehension and filters. Doesn't it looks better?
fromlinqitimportList# Go ahead and fill the list with whatever you want... like a list of <Programmer> objects.programmers=List()Avi=type("Avi", (), {})Entrepreneur=type("Entrepreneur", ('talented'), {})elon_musk=Entrepreneur(talented=True)# Then play:last_hot_pizza_slice= (programmers.where(lambdae:e.experience>15) .except_for(elon_musk) .of_type(Avi) .take(3)# [<Avi>, <Avi>, <Avi>] .select(lambdaavi:avi.lunch)# [<Pizza>, <Pizza>, <Pizza>] .where(lambdap:p.is_hot()andp.origin!="Pizza Hut") .last()# <Pizza> .slices.last()# <PizzaSlice>)# What do you think?
We all use multiple aggregations in our code, while multiple filters/comprehensions are not pythonic at all. The whole idea is is to use it for nested, multiple filters/modifications :). Some of the methods might look ridiculous for a single calls, comparing to the regular python syntax. Here are some use cases:
Deeper - Let's play with a list of people, a custom type.
importListclassPerson():def__init__(self,name,age):self.name=nameself.age=agedef__repr__(self):returnf'Person(name="{self.name}", age={self.age})')# Creating a list of peopleavi,bill,bob,harry=Person('Avi',23),Person('Bill',41),Person('Bob',77),Person('Harry',55)people=List(avi,bill,bob,harry)
Use LINQ selections, write cleaner code
people=people.where(lambdap:p.age>23)# [<Person name="Bill" age="41">, <Person name="Bob" age="77">, <Person name="Harry" age="55">]people.first()# <Person name="Bill" age="41">people.last()# <Person name="Harry" age="55">people.any(lambdap:p.name.lower().startswith('b'))# Truepeople.where(age=55)# [<Person name="Harry" age="55">]people.skip(3).any()# Falsepeople.skip(2).first()# <Person name="Harry" age="55"># Isn't it better than "for", "if", "else", "filter", "map" and list comprehensions in the middle of your code?
More selections
new_kids_in_town= [Person('Chris',18),Person('Danny',16),Person('John',17)]people+=new_kids_in_town# Also works: people = people.concat(new_kids_in_town)teenagers=people.where(lambdap:20>=p.age>=13)danny=teenagers.first(lambdat:t.name=='Danny')# <Person name="Danny" age="16">oldest_teen=teenagers.order_by(lambdat:t.age).last()# <Person name="John" age="17">