2010-08-18 7 views
38

Je pense en Python 3 je vais pouvoir le faire:Python moyen de diviser une liste en premier et reste?

first, *rest = l 

qui est exactement ce que je veux, mais j'utilise 2.6. Pour l'instant je fais:

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

C'est bien, mais je me demandais juste s'il y a quelque chose de plus élégant.

+6

Je pense que ce qui précède est très bien. Vous pouvez toujours faire 'first, rest = l [0], l [1:]'. – katrielalex

+4

En effet, vous ne pouvez pas améliorer sur ce qui précède - http://www.python.org/dev/peps/pep-3132/. – katrielalex

+1

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

Répondre

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

Fondamentalement le même, sauf que c'est un oneliner. Tuple roches d'assigment.

C'est un peu plus longue et moins évidente, mais généralisée pour tous iterables (au lieu d'être limité à sliceables):

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

Mieux vaut: 'first, last = l [: 1], l [1:]' in le cas 'l' est vide (et c'est plus joli;). –

+4

Doit mentionner que ceux-ci ne sont pas sémantiquement les mêmes: 'l [: 1]' est une liste, 'l [0]' est un élément de la liste. –

12

Vous pouvez faire

first = l.pop(0) 

puis l sera la du repos. Cela modifie votre liste d'origine, alors peut-être que ce n'est pas ce que vous voulez.

+2

Hey! Je ne savais pas que vous pouviez fournir un index pour pop. C'est inhabituel, mais pratique! Je me demandais pourquoi il n'y a pas de méthode de décalage sur les listes. Merci! – Shawn

+0

Cela ne fonctionnera pas pour les listes vides: '' 'x = []; x.pop (0) retraçage (appel le plus récent en dernier): Fichier "", ligne 1, dans IndexError: pop de la liste vide '' '' – avyfain

-2

Je suggère:

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

list' n'a pas '.split() 'méthode. – cpburnz

+0

ooops! mon erreur, même si c'était pour une chaîne – FGH

Questions connexes