跳转到主要内容

高效的对象列表过滤

项目描述

listful

pypi Python: 3.7+ Downloads Build Status Code coverage License: MIT Code style: black

描述

高效的对象列表过滤

安装

pip install listful

使用

使用您要过滤的字段初始化

    >>> from listful import Listful
    >>> data = Listful(
    ...    [{'x': 1, 'y': 10}, {'x': 2, 'y': 20}, {'x': 2, 'y': 30}], 
    ...    fields=['x', 'y']
    ... )

(如果您没有指定字段,将选择所有具有可哈希值的对应字段的字段)

过滤

  • 单个字段

      >>> data.filter(x=1).one_or_none()
      {'x': 1, 'y': 10}
      >>> data.filter(y=20).one_or_none()
      {'x': 2, 'y': 20}
    
  • 单个字段,有多个结果

      >>> data.filter(x=2).to_list()
      [{'x': 2, 'y': 20}, {'x': 2, 'y': 30}]
    
  • 两个字段

      >>> data.filter(x=2, y=30).one_or_none()
      {'x': 2, 'y': 30}
    
  • 如果找到多个,则引发异常

      >>> data.filter(x=2).one_or_raise()
      Traceback (most recent call last):
      <...>
      listful.exceptions.MoreThanOneResultException: Found more than one result for filter {'x': 2}: [{'x': 2, 'y': 20}, {'x': 2, 'y': 30}]
    
  • 获取特定字段的全部值

      >>> data.get_all_for_field('x')
      [1, 2, 2]
    

更新索引

Listfullist 具有相同的API,因此您可以以相同的方式获取/设置/删除项目,索引将自动更新

    >>> data[0] = {'x': 17, 'y': 17}
    >>> data.filter(x=17).one_or_none()
    {'x': 17, 'y': 17}
    >>> data[0]
    {'x': 17, 'y': 17}
    >>> del data[0]
    >>> data.filter(x=17).one_or_none()

如果您想修改一个元素并更新索引,您可以显式地这样做

    >>> data[0]['x'] = 1
    >>> data.rebuild_indexes_for_item(data[0])
    >>> data.filter(x=1).one_or_none()
    {'x': 1, 'y': 20}

对象

Listful 也支持对象列表

    >>> class Item:
    ...     def __init__(self, x, y):
    ...         self.x = x
    ...         self.y = y
    ...
    ...     def __repr__(self):
    ...         return f"Item(x={self.x}, y={self.y})"

    >>> items = Listful(
    ...    [Item(x=1, y=10), Item(x=2, y=20), Item(x=2, y=30)], 
    ...    fields=['x', 'y']
    ... )
    >>> items.filter(x=1).one_or_none()
    Item(x=1, y=10)

这里,如果您没有指定字段,将选择所有具有可哈希值的字段

    >>> items = Listful(
    ...    [Item(x=1, y=10), Item(x=2, y=20), Item(x=2, y=30)], 
    ... )
    >>> items.fields
    ['x', 'y']

性能

scripts/timing.py

使用 listful 与使用 pandas(带/不带索引)过滤的比较

listful pandas pandas_with_index
init 7.63e-02 3.03e-01 5.24e-02
filter:1 2.07e-05 1.46e-03 1.79e-03
filter:n 2.02e-01 7.40e+01 1.54e+01

比带索引的pandas快70倍,比不带索引的pandas快360倍。

对于开发者

创建 venv 并安装依赖项

make init

安装 git 预提交钩子

make precommit_install

运行 linters,autoformat,测试等。

make pretty lint test

提升新版本

make bump_major
make bump_minor
make bump_patch

许可

MIT

变更日志

未发布

  • ...

0.3.0 - 2021-01-17

  • ...

0.2.1 - 2020-04-08

  • ...

0.2.0 - 2020-04-08

  • 添加对默认字段的支持

0.1.3 - 2020-02-14

  • ...

0.1.1 - 2020-02-12

  • ...

0.1.0 - 2020-02-12

  • initial

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

listful-0.3.0.tar.gz (7.6 kB 查看哈希值)

上传时间 源代码

构建分发

listful-0.3.0-py3-none-any.whl (7.3 kB 查看哈希值)

上传时间 Python 3

由以下支持