Удалить значение None из списка без удаления значения 0
Это был мой источник, с которого я начал.
Мой список
L = [0, 23, 234, 89, None, 0, 35, 9]
Когда я запустил это:
L = filter(None, L)
Получаю результаты
[23, 234, 89, 35, 9]
Но это не то, что мне нужно, мне действительно нужно:
[0, 23, 234, 89, 0, 35, 9]
Потому что я вычисляю процентиль данных, а 0 делает большую разницу.
Как удалить значение None из списка без удаления значения 0?
Ответы
Ответ 1
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
Просто для удовольствия, вот как вы можете адаптировать filter
для этого, не используя lambda
, (я бы не рекомендовал этот код - это просто для научных целей)
>>> from operator import is_not
>>> from functools import partial
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(partial(is_not, None), L)
[0, 23, 234, 89, 0, 35, 9]
Ответ 2
FWIW, Python 3 упрощает эту задачу:
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(None.__ne__, L))
[0, 23, 234, 89, 0, 35, 9]
В Python 2 вместо этого вы должны использовать понимание списка:
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
Ответ 3
Для Python 2.7 (см. ответ Raymond для эквивалента Python 3):
Желая узнать, является ли что-то "не None", так распространено в python (и других языках OO), что в моей Common.py(которую я импортирую в каждый модуль с "из Common import *" ), я включаю эти строки:
def exists(it):
return (it is not None)
Затем, чтобы удалить None из списка, просто выполните:
filter(exists, L)
Мне кажется, что это легче читать, чем соответствующее понимание списка (которое показывает Раймонд, как его версия Python 2).
Ответ 4
Используя понимание списка, это можно сделать следующим образом:
l = [i for i in list if i is not None]
Значение l равно:
[0, 23, 234, 89, 0, 35, 9]
Ответ 5
@jamylak ответ довольно приятный, однако, если вы не хотите импортировать несколько модулей только для выполнения этой простой задачи, напишите свой собственный lambda
на месте:
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(lambda v: v is not None, L)
[0, 23, 234, 89, 0, 35, 9]
Ответ 6
Итерация vs Пространство, использование может быть проблемой. В разных ситуациях профилирование может показаться либо более быстрым, либо интенсивным.
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
Подход first (также предложенный @jamylak, @Raymond Hettinger и @Dipto) создает дублированный список в памяти, что может быть дорогостоящим для большого списка с несколькими элементами None
.
Подход второй проходит через список один раз, а затем снова каждый раз до достижения None
. Это может быть менее интенсивным в памяти, и список будет уменьшаться по мере его поступления. Уменьшение размера списка может ускориться для большого количества записей None
на передней панели, но в худшем случае будет много записей None
.
Подход цикла for
может быть распараллелен, если части списка были распределены для каждого обрабатывающего элемента. Подход list
понимания также может быть распараллелен порцией, чтобы ограничить дублирование в памяти.
Попытка выполнить итерацию по списку и удалить записи None
на месте осложняется из-за сокращения списка при удалении элементов. Такая же проблема (наряду с обычными проблемами параллельного программирования) приведет к любым попыткам распараллеливания.
Выбор любого подхода, вероятно, не имеет значения в обычных ситуациях. Это становится скорее предпочтительным обозначением.
Ответ 7
from operator import is_not
from functools import partial
filter_null = partial(filter, partial(is_not, None))
# A test case
L = [1, None, 2, None, 3]
L = list(filter_null(L))
Ответ 8
Скажите, что список похож ниже
iterator = [None, 1, 2, 0, '', None, False, {}, (), []]
Это вернет только те элементы, чей bool(item) is True
print filter(lambda item: item, iterator)
# [1, 2]
Это эквивалентно
print [item for item in iterator if item]
Чтобы просто фильтровать None:
print filter(lambda item: item is not None, iterator)
# [1, 2, 0, '', False, {}, (), []]
Эквивалент:
print [item for item in iterator if item is not None]
Чтобы получить все элементы, которые оцениваются с помощью False
print filter(lambda item: not item, iterator)
# Will print [None, '', 0, None, False, {}, (), []]
Ответ 9
Если это список списков, вы можете изменить ответ sir @Raymond
L = [ [None], [123], [None], [151] ]
no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) )
для python 2, однако
no_none_val = [x[0] for x in L if x[0] is not None]
""" Both returns [123, 151]"""
< < list_indice [0] для переменной в списке, если переменная не является None →
Ответ 10
Это решение использует , а, а не для:
value = None
while value in yourlist:
yourlist.remove(value)