Skip to main content

A small package introducing a new way to use higher order functions with lists

Reason this release was yanked:

Invalid imports

Project description

Qwery List

QList is a small library introducing a new way to use higher order functions with lists, with lazy evaluation. It also aims to address ugly python list methods such as map, filter and reduce. Whoever invented this:

xs = ['1', '2', '3', '4']
s = reduce(lambda acc, x: acc + x, filter(lambda x: x < 3, map(int, xs)), 0)

must reevaluate their life choices (yes, I am being cocky and most likely dumdum) but listen to me first and look what the world of lazy evaluation has to offer!

xs = QList(['1', '2', '3', '4'])
s = xs.map(int).filter(lambda x: x < 3).fold(lambda acc, x: acc + x, 0)

As a bonus you get len() method, so no longer will you be forced to wrap your lists in this type of code len(xs) and simply call xs.len() (I understand it is negligibly slower but look how much nicer it looks!)

Quick tutorial

Let's say we want to read numbers from a file and choose only the even ones. No problem at all!

from qwlist import QList

with open('path/to/file.txt', 'r') as file:
    qlist = QList(file.readlines())
even = qlist.map(int).filter(lambda x: x % 2 == 0).collect()

Why is there this collect at the end? Because all operations on the QList are lazy evaluated, so in order to finally apply all the operations you need to express that.

There is also an eagerly evaluated EagerQList in case all the actions performed on the list should be evaluated instantaneously. This object is in the qwlist.eager module, but it is also possible to transform QList into EagerQList simply by calling eager()

>>> from qwlist import QList
>>> QList(range(3)).eager().map(str)
['0', '1', '2']

EagerQList has the same methods that QList has (filter, map, foreach, ...) but not lazy evaluated so there is no need to call collect at the end.


Examples

Making QList from an iterable

>>> QList([1, 2, 3, 4])
[1, 2, 3, 4]

Making QList from a generator

>>> QList(range(3))
[0, 1, 2]

Making a list of pairs: int and str

>>> qlist = QList([1, 2, 3])
>>> qlist.zip(qlist.map(str)).collect()
[(1, '1'), (2, '2'), (3, '3')]

Summing only the even numbers

>>> QList(range(10)).filter(lambda x: x % 2 == 0).fold(lambda acc, x: acc + x, 0)
20

Side note

This syntax resembles Rust syntax:

Rust Python
let xs = vec![1, 2, 3, 4];
let double_xs: Vec<i32> = xs.iter().map(|&x| x * 2).collect();
println!("{double_xs:?}");
// [2, 4, 6, 8]
xs = QList([1, 2, 3, 4])
double_xs = xs.map(lambda x: x * 2).collect()
print(double_xs)
# [2, 4, 6, 8]

Story behind this whole idea

Prime idea? Vicious mockery!
During studying, I had to do a lot of list comprehensions in Python, alongside methods such as map or filter and although they are quite powerful, using them in Python is just annoying. Combining them makes you read the code in an unnatural order going from right to left. That is the main reason that for a long time I preferred simple for-loops as opposed to using mentioned methods. Until one day my teacher asked the whole class why no one is using list comprehensions and higher order functions.
"Do you guys know python?" he asked tendentiously.
"I would use those functions if they were nicer" I thought.
During that period I also learnt Rust and immediately fell for it. Especially with how convenient it is to replace for-loops with method calls. And that's how the idea for a python package qwlist was born.

I hereby announce that UwU, Qwery Listwu!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qwlist-1.1.0.tar.gz (652.1 kB view details)

Uploaded Source

Built Distribution

qwlist-1.1.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

File details

Details for the file qwlist-1.1.0.tar.gz.

File metadata

  • Download URL: qwlist-1.1.0.tar.gz
  • Upload date:
  • Size: 652.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for qwlist-1.1.0.tar.gz
Algorithm Hash digest
SHA256 ae75cf402827cc369e165366d8fa76839b709b40681d7d0ff74aa590710e5d4b
MD5 235fdf95614c2ad51f0696e6a607ceba
BLAKE2b-256 4cff73f022792ba14e15ba5f175a322d29c93e7ee8df50ca229f789312b953d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for qwlist-1.1.0.tar.gz:

Publisher: publish-to-pypi.yml on WitoldFracek/qlist

Attestations:

File details

Details for the file qwlist-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: qwlist-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for qwlist-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b6cda8378367b6b5f8e6b51c0e5b48dcb489da403916ef4c92589e736c649f55
MD5 fc1430a82aaf8591c2ad7fe3febede31
BLAKE2b-256 26b0bfcddcd8be347a5ac8e4b03fda1836084d4507f4d9f9e478696c1d50251c

See more details on using hashes here.

Provenance

The following attestation bundles were made for qwlist-1.1.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on WitoldFracek/qlist

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page