程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> python強大的區間處理庫interval用法介紹

python強大的區間處理庫interval用法介紹

編輯:Python

前言

這個庫是在閱讀別人的源碼的時候看到的,覺得十分好用,然而在網上找到的相關資料甚少,所以閱讀了源碼來做一個簡單的用法總結。在網絡的路由表中,經常會通過掩碼來表示流表的匹配域,在python中有的時候為了方便的模擬流表的匹配過程,可以通過一個整數區間來表示諸如IP等的匹配范圍,而本文介紹的庫在區間處理上是十分的強大與方便。

用法舉例

不論是在Linux系統還是Windows系統上,我們都可以方便的安裝pip或者easy_install庫來方便的安裝大多數python庫,interval也不例外。
在這個庫中提供了兩個主要的類,分別是Interval和IntervalSet兩個類。
Interval類描述了一個連續的范圍區間,這個區間可以是閉、開、半閉半開、無窮的,他的區間值不一定是數字,可以包含任何的數據類型,比如字符串,時間等等,同時他和python的各種操作(<, <=, ==, >=, >等)也是兼容的。IntervalSet包含了一個或多個互不相交的Interval集合。下面的這幾個例子是源碼中的。

>>> volume1 = Interval.between("A", "Foe")
>>> volume2 = Interval.between("Fog", "McAfee")
>>> volume3 = Interval.between("McDonalds", "Space")
>>> volume4 = Interval.between("Spade", "Zygote")
>>> encyclopedia = IntervalSet([volume1, volume2, volume3, volume4])
>>> mySet = IntervalSet([volume1, volume3, volume4])
>>> "Meteor" in encyclopedia
True
>>> "Goose" in encyclopedia
True
>>> "Goose" in mySet
False
>>> volume2 in (encyclopedia ^ mySet)
True

前面的三個例子比較容易理解,最後一個例子中,encyclopedia的區別就是mySet多了一個volume2,而異或就是將兩個集合中相同的元素去掉,不同的元素保留,所以最後只剩下了volume2。
除了字符串,利用interval還可以很方便的處理時間,下面的例子同樣來自於源碼。

>>> officeHours = IntervalSet.between("08:00", "17:00")
>>> myLunch = IntervalSet.between("11:30", "12:30")
>>> myHours = IntervalSet.between("08:30", "19:30") - myLunch
>>> myHours.issubset(officeHours)
False
>>> "12:00" in myHours
False
>>> "15:30" in myHours
True
>>> inOffice = officeHours & myHours
>>> print inOffice
['08:30'..'11:30'),('12:30'..'17:00']
>>> overtime = myHours - officeHours
>>> print overtime
('17:00'..'19:30']

在前言中說道interval庫可以處理IP地址,簡單的列舉應用如下:

# coding
r1 = IntervalSet([Interval(1, 1000), Interval(1100, 1200)])
r2 = IntervalSet([Interval(30, 50), Interval(60, 200), Interval(1150, 1300)])

r3 = IntervalSet([Interval(1000, 3000)])
r4 = IntervalSet([Interval(1000, 3000)])
r5 = IntervalSet([Interval(30000, 12000)])

print (r3 - r4), (r4 - r3), r3 & r4
print len(IntervalSet.empty())

if r3 & r4 == r4:
    print 'yes'

print r3 & r4
if (r3 - r4).empty():
   print "true"
print (r3 - r4).empty()

# output
<Empty> <Empty> [1000..3000]
0
yes
[1000..3000]
<Empty>

常用方法

  • interval對象初始化參數(lower_bound=-Inf, upper_bound=Inf, **kwargs)三個boolean參數closed,lower_closed,upper_closed分表表示全閉,左閉右開,左開右閉。比如:r = Interval(upper_bound=62, closed=False)
  • between(a, b, closed=True):返回以a和b為界的區間
  • less_than(a):小於a的所有值構成interval,類似的還有less_than_or_equal_to,greater_than,greater_than_or_equal_to函數
  • join(other):將兩個連續的intervals組合起來
  • overlaps(other):兩個區間是否有重疊
  • adjacent_to(other):兩個區間是否不重疊的毗鄰

總結

是一篇總結文章,並沒有什麼深度,只是為了不再重復造輪子,在必要的時候一個庫可以極大的提高效率。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved