跳转到主要内容

将整数列表压缩为范围对象

项目描述

Project Status: Active — The project has reached a stable, usable state and is being actively developed. CI Status https://codecov.io/gh/jwodder/derange/branch/master/graph/badge.svg https://img.shields.io/pypi/pyversions/derange.svg MIT License

GitHub | PyPI | 问题 | 变更日志

您有一份整数列表吗?您想知道列表覆盖的连续值范围吗?您需要解决一个间隔和岛屿问题吗?也许您有一份日期列表,需要找到发生某事的最长连续日数。不?为什么?不管怎样,derange模块在这里为您解决所有这些问题,还有一些其他问题。

安装

derange 需要 Python 3.6 或更高版本。只需使用 Python 3 的 pip 来安装(你有 pip 吗?)

python3 -m pip install derange

示例

将来自 git log 或类似工具的提交年份压缩到 range 对象中

>>> import derange
>>> derange.derange([2015, 2015, 2015, 2014, 2014, 2011, 2010, 2010, 2009, 2009])
[range(2009, 2012), range(2014, 2016)]

如果输入已经排序,可以使用 derange_sorted() 略微更快地进行压缩

>>> derange.derange_sorted([2009, 2009, 2010, 2010, 2011, 2014, 2014, 2015, 2015, 2015])
[range(2009, 2012), range(2014, 2016)]

使用 deinterval() 将非整数值组织成闭合区间(以端点对表示)

>>> import datetime
>>> # deinterval() requires a callable for determining when two values are "adjacent":
>>> def within_24_hours(a,b):
...     return abs(a-b) <= datetime.timedelta(hours=24)
...
>>> timestamps = [
...     datetime.datetime(2017, 11, 2, 12, 0),
...     datetime.datetime(2017, 11, 3, 11, 0),
...     datetime.datetime(2017, 11, 4, 10, 0),
...     datetime.datetime(2017, 11, 5,  9, 0),
...     datetime.datetime(2017, 11, 6,  9, 0),
...     datetime.datetime(2017, 11, 7, 10, 0),
... ]
>>> derange.deinterval(within_24_hours, timestamps)
[(datetime.datetime(2017, 11, 2, 12, 0), datetime.datetime(2017, 11, 6, 9, 0)), (datetime.datetime(2017, 11, 7, 10, 0), datetime.datetime(2017, 11, 7, 10, 0))]

…它还有一个 deinterval_sorted() 变体

>>> derange.deinterval_sorted(within_24_hours, timestamps)
[(datetime.datetime(2017, 11, 2, 12, 0), datetime.datetime(2017, 11, 6, 9, 0)), (datetime.datetime(2017, 11, 7, 10, 0), datetime.datetime(2017, 11, 7, 10, 0))]
>>> derange.deinterval_sorted(within_24_hours, reversed(timestamps))
Traceback (most recent call last):
    ...
ValueError: sequence not in ascending order

API

derange.derange(iterable: Iterable[int]) -> List[range]

将整数序列转换为包含所有输入元素的最小范围对象列表。

输出是严格升序的。输入不必有序(但也可以参考 derange_sorted())。重复的输入值将被忽略。

derange.derange_sorted(iterable: Iterable[int]) -> List[range]

将非递减整数序列转换为包含所有输入元素的最小范围对象列表。这比 derange() 快,但只接受排序后的输入。

derange.deinterval(
    adjacent: Callable[[T,T], bool],
    iterable: Iterable[T],
) -> List[Tuple[T,T]]

将有序值序列转换为包含所有输入元素的最小闭合区间列表(以端点对表示)。这是对任意类型的 derange() 的一般化。

如果两个输入值直接相邻或者存在通过相邻输入值连接它们的链,则这两个输入值将被放置在同一个区间内,其中相邻是通过给定的 adjacent 可调用函数定义的。

adjacent 将被用来同时调用 iterable 的两个元素以测试它们是否应该放置在同一个区间中。由 adjacent 假设的二进制关系必须是自反的和对称的,并且对于所有 x < y < z,如果 adjacent(x, z) 为真,则 adjacent(x, y)adjacent(y, z) 也必须为真。

输出是严格升序的。输入不必有序(但也可以参考 deinterval_sorted())。重复的输入值将被忽略。

注意,与范围对象不同,deinterval() 返回的区间包含它们的上界。

derange.deinterval_sorted(
    adjacent: Callable[[T,T], bool],
    iterable: Iterable[T],
) -> List[Tuple[T,T]]

将非递减有序值序列转换为包含所有输入元素的最小闭合区间列表。这比 deinterval() 快,但只接受排序后的输入。

项目详情


下载文件

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

源代码分发

derange-0.2.1.tar.gz (9.0 kB 查看哈希)

上传时间 源代码

构建分发

derange-0.2.1-py3-none-any.whl (6.7 kB 查看哈希)

上传时间 Python 3

支持者