Code Monkey home page Code Monkey logo

pyquerylist's Introduction

pyquerylist Build Status

Extension of base Python list that you can query. Queries are chainable and invertable with logical operators (& | ~). Simple operations such as .where(...), to filter, .select(...) to choose fields, and .aggregate(...) to e.g. sum over a field are supported. .groupby(...) can be also used to .count() and .aggregate(...) QueryLists as well.

Installation

pip install pyquerylist

Documentation

Documentation is available at http://markmuetz.github.io/pyquerylist/.

example.py

from dataclasses import dataclass

from pyquerylist import Query as Q, QueryList


@dataclass
class Book:
    name: str
    price_pence: int
    category: str

    def price(self):
        return self.price_pence / 100

    def vat_price(self):
        return self.price() * 1.2


books = QueryList(
    [
        Book('Three crows', 500, 'fantasy'),
        Book('Molly had a little calf', 200, 'child'),
        Book('Time for another', 150, 'bargain'),
        Book('Of stars and mud', 700, 'highbrow'),
        Book('The Fruggalo', 300, 'child'),
        Book('Three women in a canoe', 120, 'classic'),
        Book('Who turns the page', 700, 'mystery'),
        Book('The sword of silver', 300, 'fantasy'),
        Book('Murder at 30000 ft', 150, 'mystery'),
        Book('Once I saw a little mouse', 50, 'child'),
        Book('The Leonardo code', 20, 'bargain'),
        Book('The place we are at', 900, 'highbrow'),
    ]
)


if __name__ == '__main__':
    print(books.count())
    # books can be filtered on one of their fields.
    print(books.where('name=="The Fruggalo"').count())
    # This can also be done using a query.
    print(books.where(Q('name=="The Fruggalo"')).count())
    # Queries can be inverted.
    print(books.where(~Q('name=="The Fruggalo"')).count())
    # books is a list -- can be indexed or sliced:
    print(books[:3])

    # books can be filtered on multiple fields, showing price <= 3.
    # if a field is a function (is callable) - it will be called (i.e. price).
    print(books.where('(category=="fantasy")&(price<=3)'))
    # Equivalent to above using combined queries.
    print(books.where(Q('category=="fantasy"') & Q('price<=3')))

    # These are equivalent, but not considered equal due to different definition.
    print(Q(lambda x: x.price <= 5) != Q('price <= 5'))

    # Queries can be combined using logical operators, and ordered by field(s).
    print(
        books.where(Q('category in ["fantasy", "mystery"]') | Q('price <= 3'))
        .orderby('price', order='descending')
        .select(fields=['category', 'price'])
    )
    # `lambda`s can be used, and fields can be chosen using `.select(...)`.
    print(
        books.where(Q('category == "fantasy"') | Q(lambda x: x.price() * 2 <= 6)).select(fields=['category', 'price'])
    )
    # Select can also take a function/lambda:
    print(books.select(func=lambda b: b.price() * 2))

    # Simple aggregate operations available.
    print(books.aggregate(sum, 'price'))
    print(books.aggregate(sum, ['price', 'vat_price']))

    # Simple group by operator (returns a dict subclass), with group operations count and aggregate.
    print(books.groupby('category')['mystery'])
    print(books.groupby('category').count())
    print(books.groupby('category').aggregate(sum, 'price'))

    # QueryLists can be formatted for tabular display.
    print(books.where('category=="fantasy"').tabulate(['name', 'price']))

pyquerylist's People

Contributors

markmuetz avatar

Watchers

 avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.