2016-01-20 4 views
7

Ich mache eine Zeitplan-App und ich brauche eine Möglichkeit, Bereich von Tagen für jeden Block zu kategorisieren. Die Tage werden als ganze Zahlen markiert:Erhalten Sie eine Reihe von Tagen in Python

MON, TUE, WEN, THU, FRI, SAT, SUN ist 0, 1, 2, 3, 4, 5, 6

Also lassen Sie uns sagen, ich habe einen Block geplant, die am Dienstag beginnt und endet am Freitag. Identifizieren seines Bereichs ist einfach:

range(block.start_day, block.end_day +1) würde mir (1, 4) geben.

Aber das wird nicht funktionieren, wenn ein Block Samstag beginnt und Mittwoch endet.

Das Ergebnis, das ich brauche, ist (5, 6, 0, 1, 2).

Ich bin irgendwie in diesem Teil fest. Ich denke, ich könnte einen Modulo-Operator benutzen, aber ich bin mir nicht sicher.

** EDIT ** Ich entschuldige mich, ich habe die richtige gewünschte Ausgabe aktualisiert.

Mit Python 2.7.6

+1

Kann eine Reichweite länger als eine Woche sein? Wenn ja, wie gehen Sie davon aus? –

+1

Warum nicht das Datum verwenden? – BAE

+0

@ScottHunter nein, Reichweite kann nicht länger als eine Woche sein. –

Antwort

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) kehrt [5, 6, 0, 1, 2, 3]

days(3, 5) kehrt [3, 4, 5]

2

Eine Sache, die Sie bedingte Logik verwenden tun könnten:

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 

Ich bin sicher, dass jemand hier kann mit einer eleganteren Lösung kommen, aber das bekommt man gestartet.

Nur aus Gründen der Gründlichkeit, glaube ich, die gleiche Sache in Python erreicht werden kann 3 (wobei der Bereich einen Iterator erzeugt, anstatt eine Liste) itertools.chain statt + mit r1 und r2 verketten.

2

Eine Möglichkeit, mit ungeraden Bereiche zu beschäftigen ist eine Funktion benutzerdefinierten Bereich zu implementieren:

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)) 

Ergebnis:

[1, 2, 3, 4] 
[5, 6, 0, 1, 2] 
[5, 6, 0, 1, 2] 
0

Hier ist meine Lösung:

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) 

Ergebnis:

get_range([1,4]) -> [1, 2, 3, 4] 
get_range([5,2]) -> [5, 6, 0, 1, 2] 
+0

Was erzeugt 'get_range ([4,1])'? Außerdem ist "x" nicht definiert. –

+0

Sie haben Recht, Entschuldigung dafür. Ich habe es korrigiert. – purrogrammer

0

können Sie diese Funktion verwenden:

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 

Testfälle:

getrange(1,4) =>[1,2,3,4] 
getrange(5,2) =>[5,6,0,1,2] 
Verwandte Themen