Pythonic способ разделить список на первый и остальные?

Я думаю, что в Python 3 я смогу сделать:

first, *rest = l

это именно то, что я хочу, но я использую 2.6. Пока делаю:

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

Это хорошо, но мне просто интересно, есть ли что-то более элегантное.


person Shawn    schedule 18.08.2010    source источник
comment
Я думаю, что вышесказанное в порядке. Вы всегда можете сделать first, rest = l[0], l[1:].   -  person Katriel    schedule 18.08.2010
comment
Действительно, вы не можете улучшить вышеизложенное -- python.org/dev/peps. /pep-3132.   -  person Katriel    schedule 18.08.2010
comment
Связано: stackoverflow.com/questions /10532473/   -  person Denilson Sá Maia    schedule 01.03.2016


Ответы (4)


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

В основном то же самое, за исключением того, что это oneliner. Кортеж присвоения породы.

Это немного длиннее и менее очевидно, но обобщено для всех итераций (вместо того, чтобы ограничиваться срезами):

i = iter(l)
first = next(i) # i.next() in older versions
rest = list(i)
person Community    schedule 18.08.2010
comment
Лучше: first, last = l[:1], l[1:] в случае, если l пусто (и это красивее ;). - person Don O'Donnell; 19.08.2010
comment
Следует отметить, что семантически это не одно и то же: l[:1] — это список, l[0] — это элемент списка. - person Don O'Donnell; 19.08.2010

Ты можешь сделать

first = l.pop(0)

и тогда l будет остальным. Однако он изменяет ваш исходный список, поэтому, возможно, это не то, что вам нужно.

person Olivier 'Ölbaum' Scherler    schedule 18.08.2010
comment
Это не будет работать для пустых списков: x = []; x.pop(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pop from empty list - person avyfain; 19.07.2017
comment
@avyfain: ни один из них не будет работать с примером OP на Python3. first, *rest = [] вызвать ValueError. - person kriss; 04.04.2019

Я бы предложил:

first, remainder = l.split(None, maxsplit=1)
person FGHP    schedule 08.07.2016
comment
list не имеет метода .split(). - person All Workers Are Essential; 08.07.2016
comment
упс! моя ошибка, хотя это было для строки - person FGHP; 10.07.2016
comment
Тем не менее +1, хотя в данном случае это неправильно, это было хорошо, потому что я хотел разделить строку и назначить начало + остаток результата разным переменным. - person Gnudiff; 04.07.2019
comment
Обратите внимание, что это вызывает ошибку, если разделение возвращает только список из 1 элемента. - person Peter Gibson; 26.07.2021

Еще один, работающий с python 2.7. Просто используйте промежуточную функцию. Логично, поскольку новое поведение имитирует то, что произошло при передаче параметров функций.

li = [1, 2, 3]
first, rest = (lambda x, *y: (x, y))(*li)
person kriss    schedule 04.04.2019