Удалить значение 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)