2012-08-29 17 views
22

Esiste un modo pulito per ottenere il valore in un indice di lista di None se l'indice è out o range in Python?Ottieni valore all'indice lista/matrice o "Nessuno" se fuori intervallo in Python

Il modo più ovvio per farlo sarebbe questo:

if len(the_list) > i: 
    return the_list[i] 
else: 
    return None 

Tuttavia, il livello di dettaglio riduce la leggibilità del codice. C'è un semplice liner pulito che può essere usato al suo posto?

+1

Non penso che sia una buona idea. Che mi dici delle fette? Indici negativi? L'ambiguità di una lista con una None in essa? –

+0

Possibile duplicato di [Come ottenere l'ennesimo elemento di un elenco python o un valore predefinito se non disponibile] (https://stackoverflow.com/questions/2492087/how-to-get-the-nth-element-of-a -python-list-or-a-default-if-not-available) – Rotareti

risposta

25

Prova:

try: 
    return the_list[i] 
except IndexError: 
    return None 

Oppure, uno di linea:

l[i] if i < len(l) else None 

Esempio:

>>> l=range(5) 
>>> i=6 
>>> print(l[i] if i < len(l) else None) 
None 
>>> i=2 
>>> print(l[i] if i < len(l) else None) 
2 
+3

Questo ha lo sfortunato effetto collaterale dell'uso di eccezioni come flusso di controllo, che il suo originale già non ha e questo non è molto meno dettagliato. –

+0

Questo è davvero molto meglio da fare, ma non è esattamente meno prolisso, vero? – BrtH

+9

@DanielDiPaolo: In Python, l'utilizzo di eccezioni in questo modo è incoraggiato e non disapprovato. – BrtH

6
return the_list[i] if len(the_list) > i else None 
+0

il modo più prolisso imho ... –

+0

@JoranBeasley In che modo nel mondo c'è un solo liner più prolisso di vari affermazioni di linea? – semicolon

+3

@semicolon Poiché la verbosità non si basa esclusivamente su numeri di righe ... – Metalstorm

4

Per i vostri scopi è possibile escludere la parte else come None è di ritorno di default se un dato condizione non soddisfatta.

def return_ele(x, i): 
    if len(x) > i: return x[i] 

Risultato

>>> x = [2,3,4] 
>>> b = return_ele(x, 2) 
>>> b 
4 
>>> b = return_ele(x, 5) 
>>> b 
>>> type(b) 
<type 'NoneType'> 
8

trovo lista fette buono per questo:

>>> x = [1, 2, 3] 
>>> a = x [1:2] 
>>> a 
[2] 
>>> b = x [4:5] 
>>> b 
[] 

Così, accedere sempre x [i: i + 1], se si vuole x [i] . Otterrai una lista con l'elemento richiesto se esiste. Altrimenti, ottieni una lista vuota.

+2

Addendum: Questo può essere espanso per essere 'my_list [idx: idx + 1] o" Default_value "'.Leggibile e succinto! :) – Erich

+0

Questa dovrebbe essere la risposta accettata come one-liner che evita un if e funziona con liste vuote. Funziona bene anche con liste create dalla list comprehension: 'a = [1,3,5,7,9]; b = [num per num in a se num% 2 == 0] [0: 1] o "Nessun altro trovato"; stampa (b) Non trovato nessun altro' –

Problemi correlati