Для маленьких list
с, как в вашем примере, делать что-то вроде list.pop(0)
можно:
nested = [[1,2,3], [4,5,6], [7,8,9]]
for inner in nested:
inner.pop(0) # Remove first element of each inner list
Однако, поскольку list
s в основном реализованы как массивы (указателей), удалениеПервый элемент означает, что все остальные элементы должны быть сдвинуты назад на один, что приводит к большому количеству копий (указателей), если ваши list
s большие. Кроме того, использование inner[1:]
вместо inner.pop(0)
не решает проблему, поскольку inner[1:]
создает новый list
, а не возвращает представление.
Одним из выходов является отображение избыточных элементов в видепоследний элемент вместо первого, так что вы можете вместо этого сделать inner.pop()
, который удалит последний элемент. Дальнейшее смещение / копирование не требуется.
Другое решение состоит в переключении структуры данных с list
на deque
("двусторонняя очередь"). Это метод popleft()
, который эквивалентен pop(0)
, но быстрый, так как deque
s поддерживает быстрое выталкивание с обоих концов:
import collections
nested = [[1,2,3], [4,5,6], [7,8,9]]
nested = [collections.deque(inner) for inner in nested] # list of deques
for inner in nested:
inner.popleft() # Remove first element of each inner list, fast!