2016-01-20 102 views
7

我在制作一个日程安排应用程序,我需要一种方法来对每个块的天数范围进行分类。日子被标记为整数:在Python中获取日期范围

MON, TUE, WEN, THU, FRI, SAT, SUN0, 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

+1

范围可以超过一周吗?如果是这样,你如何预期处理呢? –

+1

为什么不使用日期? – BAE

+0

@ScottHunter不,范围不能超过一周。 –

回答

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]

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(范围产生一个迭代器,而不是一个列表)使用itertools.chain代替+来连接r1r2来完成。对付奇范围

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] 
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] 
+0

get_range([4,1])产生了什么?另外,'x'没有被定义。 –

+0

你说得对,对不起。我纠正了它。 – purrogrammer

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]