2016-01-20 23 views
7

Sto creando un'app di pianificazione e ho bisogno di un modo per classificare l'intervallo di giorni per ciascun blocco. Le giornate sono contrassegnati come numeri interi:Ottenere un intervallo di giorni in Python

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

Quindi diciamo che ho programmato un blocco che inizia Martedì e Venerdì finisce. Identificare il suo intervallo è semplice:

range(block.start_day, block.end_day +1) mi darebbe (1, 4).

Ma questo non funzionerà se un blocco inizia sabato e finisce mercoledì.

Il risultato che mi serve è (5, 6, 0, 1, 2).

Sono un po 'bloccato in questa parte. Immagino di poter usare un operatore modulo, ma non ne sono sicuro.

** MODIFICA ** Mi scuso, ho aggiornato l'output desiderato corretto.

Usare Python 2.7.6

+1

Un intervallo può essere più lungo di una settimana? Se sì, come prevedi di gestirlo? –

+1

perché non usare la data? – BAE

+0

@ScottHunter no, l'intervallo non può essere più lungo di una settimana. –

risposta

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

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

2

Una cosa che potreste fare è utilizzare la logica condizionale:

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 

Sono sicuro che qualcuno qui in grado di trovare una soluzione più elegante, ma questo si ottiene iniziato.

Solo per ragioni di completezza, credo che la stessa cosa può essere realizzato in Python 3 (ove l'estensione produce un iteratore, piuttosto che una lista) utilizzando itertools.chain invece di + per concatenare r1 e r2.

2

Un modo per affrontare con le gamme dispari è quello di implementare una funzione intervallo personalizzato:

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

Risultato:

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

Ecco la mia soluzione:

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) 

risultato:

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

Cosa produce 'get_range ([4,1])'? Inoltre, 'x' non è definito. –

+0

Hai ragione, mi dispiace per quello. L'ho corretto – purrogrammer

0

È possibile utilizzare questa funzione:

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 

casi di test:

getrange(1,4) =>[1,2,3,4] 
getrange(5,2) =>[5,6,0,1,2] 
Problemi correlati