Sono sicuro che c'è un modo più semplice di farlo che non mi sta succedendo.
Sto chiamando un mucchio di metodi che restituiscono un elenco. L'elenco potrebbe essere vuoto. Se l'elenco non è vuoto, desidero restituire il primo elemento; altrimenti, voglio restituire None. Questo codice funziona:
my_list = get_list()
if len(my_list) > 0: return my_list[0]
return None
Mi sembra che ci dovrebbe essere un semplice linguaggio a una linea per farlo, ma per la mia vita non riesco a pensarci. È lì?
Modificare:
Il motivo per cui sto cercando un'espressione di una riga qui non è che mi piace il codice incredibilmente conciso, ma perché devo scrivere un sacco di codice come questo:
x = get_first_list()
if x:
# do something with x[0]
# inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
# do something with y[0]
# inevitably forget the [0] part AGAIN, and have another bug to fix
Quello che mi piacerebbe fare può certamente essere realizzato con una funzione (e probabilmente lo sarà):
def first_item(list_or_none):
if list_or_none: return list_or_none[0]
x = first_item(get_first_list())
if x:
# do something with x
y = first_item(get_second_list())
if y:
# do something with y
Ho pubblicato la domanda perché sono spesso sorpreso da ciò che possono fare semplici espressioni in Python e ho pensato che scrivere una funzione fosse una cosa sciocca da fare se esistesse una semplice espressione che potesse fare il trucco. Ma vedendo queste risposte, sembra che una funzione sia la soluzione semplice.
next(iter(your_list))
, dal momento che se fornisci un secondo argomento iter
, lo stai dicendo che il primo argomento è richiamabile.
next(iter(your_list), None)
invece difirst_item(your_list)
supporre cheyour_list
non lo siaNone
(get_first_list()
eget_second_list()
deve sempre restituire un iterabile).