2015-10-16 5 views
31

Quando un elenco Python è noto per contenere sempre un singolo elemento, c'è modo per accedervi diverso: '? Perché si vuole a'Ottenere solo elementi da un elenco di elementi singoli in Python?

mylist[0] 

Ci si può chiedere,. Curiosità da sola. Sembra esserci un modo alternativo per fare di tutto in Python.

+5

Ci possono essere alternative, ma di solito c'è solo un * ovvio * modo per farlo - e, in questo caso, sembra che tu l'abbia già trovato. – ekhumoro

+0

se * sempre * contiene un singolo elemento, allora forse un 'elenco' non è il miglior tipo di dati? –

+3

@ekhumoro: In realtà sono parziale al metodo di spacchettamento della sequenza, perché verifica l'ipotesi che la sequenza abbia un solo elemento. 'mylist [0]' ha successo quando hai almeno un elemento, ma non si lamenta se hai effettivamente 30 elementi. 'singleitem, = mylist' verifica che tu abbia esattamente un elemento, né più né meno. – ShadowRanger

risposta

48

Sequenza disimballaggio:

singleitem, = mylist 
# Identical in behavior (byte code produced is the same), 
# but arguably more readable since a lone trailing comma could be missed: 
[singleitem] = mylist 

uso esplicito protocollo iteratore:

singleitem = next(iter(mylist)) 

distruttivo pop:

singleitem = mylist.pop() 

indice negativo:

singleitem = mylist[-1] 

impostato tramite singola iterazione for (perché la variabile loop rimane disponibile con l'ultimo valore quando un ciclo termina):

for singleitem in mylist: break 

Molti altri (conciliano o variabile bit di cui sopra, o altrimenti basandosi su iterazione implicita) , ma tu hai l'idea.

+3

Non degno di inclusione nella risposta principale a causa della pazzia sfrenata: Disabilitazione del parametro sulla funzione a singolo argomento (eseguita come anonima lambda che restituisce il valore per il massimo stupido): 'singleitem = (lambda x: x) (* mylist)' – ShadowRanger

+2

Il primo uno è unico in quanto solleva anche se la lista contiene più di un elemento. –

+6

Il primo può anche essere scritto come '[singleitem] = mylist'. –

4

Aggiungo che la libreria more_itertools ha uno strumento che restituisce un elemento da un iterabile.

from more_itertools import one 


iterable = ["foo"] 
one(iterable) 
# "foo" 

Inoltre, more_itertools.one solleva un errore se iterable è vuoto o ha più di un articolo.

iterable = [] 
one(iterable) 
# ValueError: not enough values to unpack (expected 1, got 0) 

iterable = ["foo", "bar"] 
one(iterable) 
# ValueError: too many values to unpack (expected 1)