我正在制作计划应用程序,我需要一种方法来对每个街区的天数进行分类。日期标记为整数:
MON, TUE, WEN, THU, FRI, SAT, SUN
是0, 1, 2, 3, 4, 5, 6
所以,假设我已经安排了一个从周二开始到周五结束的街区。 确定其范围很简单:
range(block.start_day, block.end_day +1)
会给我(1, 4)
。
但如果一个区块在星期六开始并在星期三结束,那将无效。
我需要的结果是(5, 6, 0, 1, 2)
。
我有点卡在这一部分。我想我可以使用模运算符,但我不确定。
**编辑** 我道歉,我已经更新了正确的所需输出。
使用Python 2.7.6
答案 0 :(得分:2)
您可以做的一件事是使用条件逻辑:
def get_range(start_day, end_day):
if (start_day < end_day):
r = range(start_day, end_day + 1)
else:
r1 = range(start_day, 7)
r2 = range(0, end_day + 1)
r = r1 + r2
return r
我确信这里有人可以提出更优雅的解决方案,但这可以让你开始。
只是为了彻底,我相信在python 3中可以完成同样的事情(其中range产生迭代器而不是列表)使用itertools.chain
而不是+
来连接{{ 1}}和r1
。
答案 1 :(得分:2)
处理奇数范围的一种方法是实现自定义范围函数:
def date_range(start, end):
'Return a list of weekday values in the range [START, END]'
names = dict(zip(
['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],
range(7)))
try:
start = names[start.upper()]
except:
pass
try:
end = names[end.upper()]
except:
pass
while True:
yield start % 7
if start % 7 == end % 7:
return
start += 1
print list(date_range('tue', 'fri'))
print list(date_range('sat', 'wed'))
print list(date_range(5, 2))
结果:
[1, 2, 3, 4]
[5, 6, 0, 1, 2]
[5, 6, 0, 1, 2]
答案 2 :(得分:2)
def days(f, L):
if f > L:
x = list(range(0, 7))
return x[f:] + x[:L+1]
else:
return list(range(f, L+1))
days(5, 3)
返回[5, 6, 0, 1, 2, 3]
days(3, 5)
返回[3, 4, 5]
答案 3 :(得分:0)
这是我的解决方案:
def get_range(f):
week = list(range(7))
if f[1] < f[0]:
_curr = week[f[0]:]
_rest = week[:f[1]+1]
return _curr+_rest
else:
return range(f[0],f[1]+1)
结果:
get_range([1,4]) -> [1, 2, 3, 4]
get_range([5,2]) -> [5, 6, 0, 1, 2]
答案 4 :(得分:0)
您可以使用此功能:
def getrange(start,end):
result = [start]
week = [0, 1, 2, 3, 4, 5, 6]
c = start
while (week[c%7] != end):
c = c + 1
result.append(week[c%7])
return result
<强>测试用例:强>
getrange(1,4) =>[1,2,3,4]
getrange(5,2) =>[5,6,0,1,2]