A small package introducing a new way to use higher order functions with lists
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file qwlist-1.3.0.tar.gz
.
File metadata
- Download URL: qwlist-1.3.0.tar.gz
- Upload date:
- Size: 657.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 933a22a3a6d9f6db690224f77528d4e11bd1295aab22c62f8f06cee2ff245d82 |
|
MD5 | 9c82e911bc6959cc0c6af9cba3877cdf |
|
BLAKE2b-256 | 2ac67efcd822bdd379b5f96ab67018d9b541187fd4af89482570d94d09b91ac0 |
Provenance
The following attestation bundles were made for qwlist-1.3.0.tar.gz
:
Publisher:
publish-to-pypi.yml
on WitoldFracek/qlist
-
Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
qwlist-1.3.0.tar.gz
- Subject digest:
933a22a3a6d9f6db690224f77528d4e11bd1295aab22c62f8f06cee2ff245d82
- Sigstore transparency entry: 151971707
- Sigstore integration time:
- Predicate type:
File details
Details for the file qwlist-1.3.0-py3-none-any.whl
.
File metadata
- Download URL: qwlist-1.3.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97dd6ead334aac24466fb7c766098d5fafb2dd2df24564a273952a651153838b |
|
MD5 | 36a1b7c319681002a868cc59d61351d6 |
|
BLAKE2b-256 | a183096d1e4902d690b47dddc65478070ca66b5144e81dbe56dc0fd8ecf65e57 |
Provenance
The following attestation bundles were made for qwlist-1.3.0-py3-none-any.whl
:
Publisher:
publish-to-pypi.yml
on WitoldFracek/qlist
-
Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
qwlist-1.3.0-py3-none-any.whl
- Subject digest:
97dd6ead334aac24466fb7c766098d5fafb2dd2df24564a273952a651153838b
- Sigstore transparency entry: 151971708
- Sigstore integration time:
- Predicate type: