代码之家  ›  专栏  ›  技术社区  ›  Georg Schölly Crazy Developer

我怎样才能得到两天之间的所有天数?

  •  3
  • Georg Schölly Crazy Developer  · 技术社区  · 16 年前

    例子:

    Wednesday - Friday  = Wednesday, Thursday, Friday  
            3 - 5       = 3, 4, 5
    
     Saturday - Tuesday = Saturday, Sunday, Monday, Tuesday
            6 - 2       = 6, 7, 1, 2
    

    if 陈述

    必须有一个优雅的方法来解决这个问题。我在工作日使用数字1-7,但是0-6也可以。

    def between(d1, d2):
         alldays = [0,1,2,3,4,5,6,0,1,2,3,4,5,6]    # or range(7) * 2
         offset = 8 if d1 > d2 else 1
         return alldays[d1:d2 + offset]
    
    between(0, 4)
    # [0,1,2,3,4]
    
    between(5,2)
    # [5,6,0,1,2]
    
    7 回复  |  直到 16 年前
        1
  •  9
  •   Stephan202 Alex Martelli    16 年前
    >>> def weekdays_between(s, e):
    ...     return [n % 7 for n in range(s, e + (1 if e > s else 8))]
    ... 
    >>> weekdays_between(2, 4)
    [2, 3, 4]
    >>> weekdays_between(5, 1)
    [5, 6, 0, 1]
    

    >>> days = 'Mon Tue Wed Thu Fri Sat Sun'.split()
    >>> days_1 = {d: n for n, d in enumerate(days)}
    >>> def weekdays_between(s, e): 
    ...     s, e = days_1[s], days_1[e]
    ...     return [days[n % 7] for n in range(s, e + (1 if e > s else 8))]
    ... 
    >>> weekdays_between('Wed', 'Fri')
    ['Wed', 'Thu', 'Fri']
    >>> weekdays_between('Sat', 'Tue')
    ['Sat', 'Sun', 'Mon', 'Tue']
    
        2
  •  9
  •   George Shore    16 年前

    (在伪代码中)如何:

    weekday[] = {"Mon" .. "Sun"}
    for(i = wkday_start; (i % 7) != wkday_end; i = (i+1) % 7)
        printf("%s ", weekday[i]);
    

    它就像一个循环缓冲区,wkday\u start是开始的索引(基于0),wkday\u end是结束索引。

    希望这有帮助

    乔治。

        3
  •  2
  •   Community Mohan Dere    9 年前

    基于 excellent answer from Stephan202

    >>> def circular_slice(r, s, e):
    ... return [r[n % len(r)] for n in range(s, e + (1 if e>s else len(r)+1))]
    ...
    >>> circular_slice(range(0,7), 2, 4)
    [2, 3, 4]
    >>> circular_slice(range(0,7), 5, 1)
    [5, 6, 0, 1]
    >>> circular_slice('Mon Tue Wed Thu Fri Sat Sun'.split(), 5, 1)
    ['Sat', 'Sun', 'Mon', 'Tue']
    
        4
  •  1
  •   nosklo    16 年前

    提供的解决方案已经回答了这个问题,但我想提出一些额外的建议。我不知道你在干什么,但也许你想知道实际的日期?

    >>> from datetime import timedelta, date
    >>> from dateutil.rrule import rrule, DAILY
    >>> today = date(2009, 10, 13) # A tuesday
    >>> week = today - timedelta(days=6)
    >>> list(rrule(DAILY, byweekday=xrange(5), dtstart=week, until=today))
    [datetime.datetime(2009, 10, 7, 0, 0),
     datetime.datetime(2009, 10, 8, 0, 0),
     datetime.datetime(2009, 10, 9, 0, 0),
     datetime.datetime(2009, 10, 12, 0, 0),
     datetime.datetime(2009, 10, 13, 0, 0)]
    

    使用优秀的 python-dateutil 模块。

        5
  •  1
  •   PaulMcG    16 年前

    import calendar
    
    def intervening_days(day1, day2):
        weektest = list(calendar.day_name)*2
        d1 = weektest.index(day1)
        d2 = weektest.index(day2,d1+1)
        return weektest[d1:d2+1]
    
    print intervening_days("Monday","Sunday")
    print intervening_days("Monday","Tuesday")
    print intervening_days("Thursday","Tuesday")
    print intervening_days("Monday","Monday")
    

    印刷品:

    ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    ['Monday', 'Tuesday']
    ['Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
    ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday']
    

    如果不希望周一到周一返回整整一周的天数,请将d2的确定更改为 d2 = weektest.index(day2,d1) .

        6
  •  0
  •   Rubens Farias    16 年前

    DayOfWeek start = DayOfWeek.Wednesday;
    DayOfWeek end = DayOfWeek.Friday;
    
    IEnumerable<DayOfWeek> interval = 
        Enum.GetValues(typeof(DayOfWeek)).OfType<DayOfWeek>()
            .Where(d => d >= start && d <= end);
    
    Console.WriteLine(
        String.Join(", ", 
            interval.Select(d => d.ToString()).ToArray()));
    

    也许,使用任何一种语言,您都应该为每一天赋予值( Sunday=0

        7
  •  0
  •   Olexiy    16 年前

    以下代码返回1表示星期一-星期一。

    bool isWeekday(int d) {
        return d >= 1 && d <= 5;
    }
    
    int f(int d1, int d2) {
        int res = isWeekday(d1) ? 1 : 0;
        return d1 == d2 ?
               res :
               res + f(d1 % 7 + 1, d2);
    }