将整数列表压缩为范围对象
项目描述
您有一份整数列表吗?您想知道列表覆盖的连续值范围吗?您需要解决一个间隔和岛屿问题吗?也许您有一份日期列表,需要找到发生某事的最长连续日数。不?为什么?不管怎样,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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb962a5890a1433abbebcca756ba028b661e5ec66507ec5e892500228d312be1 |
|
MD5 | 0892495674ecf29b869479b1d9c63f4e |
|
BLAKE2b-256 | 68f2ef46aab499e4b064e7016413f66ae57b7fbd07f67a5ec29c865385da138f |
derange-0.2.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ba04a9a93782e3bfa305094d37253e4a8993d8b87dbb377916f21a2df7c18f1e |
|
MD5 | 6af80b15087d9916de1bf3d762d66881 |
|
BLAKE2b-256 | 227a383a07d4160bd54a3804d5ed624557aff25b6ac97e2b4489555321310569 |