2016-02-22 10 views
6

Come rimuovere le parentesi dal risultato mantenendo la funzione una singola riga di codice?La mia funzione restituisce una lista con un numero intero singolo al suo interno, come posso fare in modo che restituisca solo il numero intero?

day_list = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] 

def day_to_number(inp): 
    return [day for day in range(len(day_list)) if day_list[day] == inp] 

print day_to_number("Sunday") 
print day_to_number("Monday") 
print day_to_number("Tuesday") 
print day_to_number("Wednesday") 
print day_to_number("Thursday") 
print day_to_number("Friday") 
print day_to_number("Saturday") 

uscita:

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

Perché non si utilizza un dizionario con chiave, valore?Non vuoi davvero un elenco qui. – Maroun

+0

'day_to_number' restituisce una lista. restituire solo l'elemento desiderato. se sai che ci sarà solo 1 elemento, prendi semplicemente '[0]' – Busturdust

risposta

13

La lista di comprensione è eccessivo. Se l'elenco non contiene i duplicati (come i dati del campione mostra, basta fare)

>>> def day_to_number(inp): 
...  return day_list.index(inp) 
... 
>>> day_to_number("Sunday") 
0 

vorrei anche consigli per rendere il day_list un argomento della funzione, vale a dire:

>>> def day_to_number(inp, days): 
...  return days.index(inp) 
... 
>>> day_to_number("Sunday", day_list) 
0 

Guardando in su nel nome globale lo spazio è un po 'brutto.

E per rendere il tutto più efficiente (list.index è O (n)) utilizzare un dizionario:

>>> days = dict(zip(day_list, range(len(day_list)))) 
>>> days 
{'Monday': 1, 'Tuesday': 2, 'Friday': 5, 'Wednesday': 3, 'Thursday': 4, 'Sunday': 0, 'Saturday': 6} 
>>> 
>>> def day_to_number(inp, days): 
...  return days[inp] 
... 
>>> day_to_number("Sunday", days) 
0 
6

Ritorna la prima voce, non la lista:

return [day for day in range(len(day_list)) if day_list[day] == inp][0] 

Ma che cosa si veramente vuole fare, è cambiare la logica:

return day_list.index(inp) 
+0

Mi hai battuto per questo :( –

3

Prova questo:

return [day for day in range(len(day_list)) if day_list[day] == inp][0] 

Tuttavia, questo non è il modo più efficiente per raggiungere questo obiettivo. Prova a modificare:

day_list.index(inp) 

So che sembra che ho copiato l'altra risposta, ti giuro non ho :)

1

Questo sembra troppo complicato. Non hai bisogno di una comprensione di lista per questo compito. È possibile utilizzare il metodo index():

>>> def day_to_number(inp): 
...  return day_list.index(inp) 
... 
>>> day_to_number("Sunday") 
0 
>>> day_to_number("Monday") 
1 
>>> day_to_number("Saturday") 
6 

Se si passa un valore non valido, si alzerà un ValueError

3

Si tratta di un caso d'uso buono per un dizionario:

>>> day_map = {day: index for index, day in enumerate(day_list)} 

Usa:

>>> day_map['Sunday'] 
0 
>>> day_map['Tuesday'] 
2 
2

È inoltre possibile utilizzare il modulo calendar, che ha costanti definite per i giorni della settimana (in inglese):

>>> import calendar 
>>> def day_to_number(day): 
...  return getattr(calendar, day.upper()) 
... 
>>> day_to_number('wednesday') 
2 # Note that 0 = 'Monday' 

Se si utilizza questo, si dovrebbe probabilmente aggiungere un po 'la gestione degli errori:

>>> day_to_number('epoch') 
1970 

Oppure:

>>> day_to_number('foo') 
Traceback (most recent call last): 
    File "<ipython-input-22-4649e99206ae>", line 1, in <module> 
    day_to_number('foo') 
    File "<ipython-input-14-bf0518eb14b5>", line 2, in day_to_number 
    return getattr(calendar, day.upper()) 
AttributeError: 'module' object has no attribute 'FOO' 
+2

FWIW, i moduli 'datetime' e' calendar' sono sensibili alle impostazioni locali. Quindi se sai come usare [locales ] (https://docs.python.org/2/library/locale.html), è possibile ottenere i nomi giorno/mese per le impostazioni locali che sono state installate. –

Problemi correlati