2010-08-18 21 views
38

Penso che in Python 3 sarò in grado di fare:Modo Pythonic per dividere una lista in prima e riposare?

first, *rest = l 

che è esattamente quello che voglio, ma sto usando 2.6. Per ora sto facendo:

first = l[0] 
rest = l[1:] 

Questo va bene, ma mi stavo chiedendo se c'è qualcosa di più elegante.

+6

Credo che quanto sopra è bene. Si potrebbe sempre fare 'first, rest = l [0], l [1:]'. – katrielalex

+4

In effetti, non è possibile migliorare quanto sopra: http://www.python.org/dev/peps/pep-3132/. – katrielalex

+1

Correlati: https://stackoverflow.com/questions/10532473/python-head-and-tail-in-one-line –

risposta

29
first, rest = l[0], l[1:] 

Fondamentalmente lo stesso, tranne che è un oneliner. Rocce di tuple assigment.

Questo è un po 'più lungo e meno evidente, ma generalizzata per tutti i iterables (invece di essere limitato a sliceables):

i = iter(l) 
first = next(i) # i.next() in older versions 
rest = list(i) 
+4

Migliore è: 'first, last = l [: 1], l [1:]' in caso 'l' è vuoto (ed è più carino;). –

+4

Dovrebbe menzionare che questi non sono semanticamente uguali: 'l [: 1]' è una lista, 'l [0]' è un elemento della lista. –

12

Si può fare

first = l.pop(0) 

e poi l sarà il riposo. Tuttavia, modifica l'elenco originale, quindi forse non è quello che vuoi.

+2

Ehi! Non sapevo che potresti fornire un indice per pop. È insolito, ma a portata di mano! Mi stavo chiedendo perché non ci sia alcun metodo di spostamento sulle liste. Grazie! – Shawn

+0

Questo non funziona per gli elenchi vuoti: '' 'x = []; x.pop (0) Traceback (chiamata più recente scorso): file "", linea 1, in IndexError: pop dalla lista vuota '' '' list' – avyfain

-2

vorrei suggerire:

first, remainder = l.split(None, maxsplit=1) 
+0

non ha un '.split() 'metodo. – cpburnz

+0

ooops! il mio errore, sebbene fosse per una stringa – FGH

Problemi correlati