日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期)

發(fā)布時間:2023/12/15 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我試圖找到一個優(yōu)雅的算法,以檢查兩個年度重復(fù)周期是否重疊.這個時期與年份無關(guān),但一年可能總是閏年.

例如,期間A =(3月1日至5月1日)和期間B =(4月1日至9月1日)重疊.

此外,期間A =(10月1日至2月1日)和期間B =(1月1日至3月1日)重疊.

但是,我發(fā)現(xiàn)這比我預(yù)想的要困難得多.復(fù)雜性來自于跨越年底的時期.

我有一個有效的解決方案(參見下面的doOverlap(A,B)方法),但我發(fā)現(xiàn)它令人沮喪.

# for the rest of the MWE context code, see further

# WORKING, but a bit convulted

def doesOverlap(A, B):

'''returns True if yearly period A and B have overlapping dates'''

# list to track if day in year is part of a period A

# (this could probably be done a bit cheaper with a dictionary of tuples, but not relevant for my question)

yeardayCovered = [False for x in range(366)] # leap year

# mark the days of A

for d in range(A.start, A.start A.length):

yeardayCovered[d % 366] = True

# now check each of the days in B with A

for d in range(B.start, B.start B.length):

if yeardayCovered[d % 366]:

return True

return False

我相信應(yīng)該可以用更少的支票和更優(yōu)雅的方式來做到這一點.我已經(jīng)嘗試將其中一個開始日設(shè)置為零偏移,應(yīng)用一些模運算符,然后是常規(guī)(非循環(huán))范圍重疊檢查(Algorithm to detect overlapping periods).但我還沒有為我的所有測試用例工作.

#NOT WORKING CORRECTLY!!

def doesOverlap(A, B):

'''determines if two yearly periods have overlapping dates'''

Astart = A.start

Astop = A.stop

Bstart = B.start

Bstop = B.stop

# start day counting at Astart, at 0

offset = Astart

Astart = 0

Astop = (Astop - offset) % 366

Bstart = (Bstart - offset) % 366

Bstop = (Bstop - offset) % 366

# overlap?

# https://stackoverflow.com/a/13513973

return (Astart <= Bstop and Bstart <= Astop)

注意:我已經(jīng)用Python完成了代碼,但理想情況下解決方案應(yīng)該不是特定于Python的(即不使用通常只在Python中可用的函數(shù),而不是在C或C#中)

# MWE (Minimal Working Example)

import datetime

import unittest

class TimePeriod:

def __init__(self, startDay, startMonth, stopDay, stopMonth):

self.startDay = startDay

self.startMonth = startMonth

self.stopDay = stopDay

self.stopMonth = stopMonth

def __repr__(self):

return "From " str(self.startDay) "/" str(self.startMonth) " to " str(self.stopDay) "/" str(self.stopMonth)

def _dayOfYear(self, d, m, y=2012):

'''2012 = leap year'''

date1 = datetime.date(year=y, day=d, month=m)

return date1.timetuple().tm_yday

@property

def start(self):

'''day of year of start of period, zero-based for easier modulo operations! '''

return self._dayOfYear(self.startDay, self.startMonth) - 1

@property

def stop(self):

'''day of year of stop of period, zero-based for easier modulo operations! '''

return self._dayOfYear(self.stopDay, self.stopMonth) - 1

@property

def length(self):

'''number of days in the time period'''

_length = (self.stop - self.start) % 366 1

return _length

def doesOverlap(A, B):

# code from above goes here

class TestPeriods(unittest.TestCase):

pass

def test_generator(a, b, c):

def test(self):

self.assertEqual(doesOverlap(a, b), c)

return test

if __name__ == '__main__':

#some unit tests, probably not complete coverage of all edge cases though

tests = [["max", TimePeriod(1, 1, 31, 12), TimePeriod(1, 1, 1, 1), True],

["BinA", TimePeriod(1, 3, 1, 11), TimePeriod(1, 5, 1, 10), True],

["BoverEndA", TimePeriod(1, 1, 1, 2), TimePeriod(10, 1, 3, 3), True],

["BafterA", TimePeriod(1, 1, 1, 2), TimePeriod(2, 2, 3, 3), False],

["sBoutA", TimePeriod(1, 12, 2, 5), TimePeriod(1, 6, 1, 7), False],

["sBoverBeginA", TimePeriod(1, 11, 2, 5), TimePeriod(1, 10, 1, 12), True],

["sBinA", TimePeriod(1, 11, 2, 5), TimePeriod(1, 1, 1, 2), True],

["sBinA2", TimePeriod(1, 11, 2, 5), TimePeriod(1, 12, 10, 12), True],

["sBinA3", TimePeriod(1, 11, 2, 5), TimePeriod(1, 12, 1, 2), True],

["sBoverBeginA", TimePeriod(1, 11, 2, 5), TimePeriod(1, 10, 1, 12), True],

["Leap", TimePeriod(29, 2, 1, 4), TimePeriod(1, 10, 1, 12), False],

["BtouchEndA", TimePeriod(1, 2, 1, 2), TimePeriod(1, 2, 1, 3), True]]

for i, t in enumerate(tests):

test_name = 'test_%s' % t[0]

test = test_generator(t[1], t[2], t[3])

setattr(TestPeriods, test_name, test)

# unittest.main()

suite = unittest.TestLoader().loadTestsFromTestCase(TestPeriods)

unittest.TextTestRunner(verbosity=2).run(suite)

解決方法:

def overlap(a0, a1, b0, b1):

首先,如果在開始日期之前結(jié)束,則可以通過調(diào)整結(jié)束日期將“年”圈中的間隔“提升”到時間“線”…

if a1 < a0: a1 = 365

if b1 < b0: b1 = 365

如果兩個規(guī)則間隔相交,則存在交叉點

if a1 > b0 and a0 < b1: return True

或者如果他們確實移動[a0 … a1 [前進一年或后退一年

if a1 365 > b0 and a0 365 < b1: return True

if a1-365 > b0 and a0-365 < b1: return True

否則沒有交集

return False

來源:https://www.icode9.com/content-1-361101.html

總結(jié)

以上是生活随笔為你收集整理的python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。