Как очистить список в Python?

Это выглядит так "грязно", опустошая список таким образом:

while len(alist) > 0 : alist.pop()

Существует ли четкий способ сделать это?

7 ответов

Решение

Это фактически удаляет содержимое из списка, но не заменяет старый ярлык новым пустым списком:

del lst[:]

Вот пример:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Для полноты назначения среза имеет тот же эффект:

lst[:] = []

Его также можно использовать для сокращения части списка при одновременной замене части (но это выходит за рамки вопроса).

Обратите внимание, что делать lst = [] не очищает список, просто создает новый объект и привязывает его к переменной lst, но старый список будет по-прежнему иметь те же элементы, и эффект будет очевиден, если у него будут другие привязки переменных.

Если у вас есть Python 3.3 или выше, вы можете использовать clear() метод list который параллелен clear() из dict, set, deque и другие типы изменяемых контейнеров:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Что касается связанной страницы, то же самое может быть достигнуто с alist *= 0,

Вы можете попробовать:

alist[:] = []

Что означает: сращивание в списке [] (0 элементов) на месте [:] (все индексы от начала до конца)

[:] Является оператором среза. Смотрите этот вопрос для получения дополнительной информации.

Получается, что с Python 2.5.2, del l[:] немного медленнее, чем l[:] = [] на 1,1 ус.

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
lst *= 0

имеет тот же эффект, что и

lst[:] = []

Это немного проще и, возможно, легче запомнить. Кроме этого, сказать особо нечего

Эффективность кажется примерно одинаковой

list = []

сбросит list в пустой список.

Обратите внимание, что вы обычно не должны скрывать зарезервированные имена функций, такие как list, который является конструктором для объекта списка - вы можете использовать lst или же list_ вместо этого, например.

Другой простой код, который вы можете использовать (в зависимости от вашей ситуации):

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Вы должны начать индексирование по длине списка и перейти назад к индексу с 0, вперед, потому что это приведет к тому, что индекс будет равен длине списка, а его урежут только пополам.

Также убедитесь, что строка while имеет знак "больше или равно". Если вы пропустите его, у вас останется список [0].

Другие вопросы по тегам