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

10 Solutions collect form web for “удалить значение None из списка без удаления значения 0”

 >>> 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] 

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] 

Для Python 2.7 (см. Ответ Раймонда для эквивалента Python 3):

Желание узнать, является ли что-то «не None» настолько распространено в python (и других языках OO), что в моей Common.py (которую я импортирую в каждый модуль с «из Common import *»), я включаю следующие строки:

 def exists(it): return (it is not None) 

Затем, чтобы удалить Элементы None из списка, просто выполните:

 filter(exists, L) 

Я считаю, что это легче читать, чем соответствующее понимание списка (которое показывает Раймонд, как его версия Python 2).

Используя понимание списка, это можно сделать следующим образом:

 l = [i for i in list if i is not None] 

Значение l равно:

 [0, 23, 234, 89, 0, 35, 9] 

Ответ @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] 

Итерация против пространства , использование может быть проблемой. В разных ситуациях профилирование может показаться либо более быстрым, либо интенсивным.

 # 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, ...] 

Первый подход (также предложенный @jamylak , @Raymond Hettinger и @Dipto ) создает дублирующий список в памяти, что может быть дорогостоящим для большого списка с несколькими элементами None .

Второй подход проходит через список один раз, а затем снова каждый раз, пока None будет достигнуто значение None . Это может быть менее интенсивным в памяти, и список будет уменьшаться по мере его поступления. Уменьшение размера списка могло бы ускориться для большого количества записей None в передней части, но в худшем случае было бы, если бы много записей None были сзади.

Подход цикла цикла может быть распараллелен, если части списка были распределены для каждого элемента обработки. Подход к пониманию list также может быть распараллелен порцией, чтобы ограничить дублирование в памяти.

Попытка выполнить итерацию по списку и удалить None записей на месте осложняется из-за сокращения списка при удалении элементов. Такая же проблема (наряду с обычными проблемами параллельного программирования) приведет к любым попыткам распараллеливания.

Выбор любого подхода, вероятно, не имеет значения в обычных ситуациях. Это становится скорее предпочтительным обозначением.

Скажите, что список подобен ниже

 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] 

Чтобы получить все элементы, которые оцениваются как ложные

 print filter(lambda item: not item, iterator) # Will print [None, '', 0, None, False, {}, (), []] 

Если это список списков, вы можете изменить ответ 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 >>

 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)) 

Это решение используется , а не для :

 value = None while value in yourlist: yourlist.remove(value) 
  • Вложенные списки и списки
  • Самый быстрый способ подсчета числа вхождений в списке Python
  • Эффективность пересечения списка Python: генератор или фильтр ()?
  • Сравнить значения в одном списке
  • Убедитесь, что все значения в списке больше определенного номера
  • Добавление словаря в список в aa loop Python
  • Каков порядок оценки в python при использовании pop (), list и + =?
  • Как вернуть два значения из функции в Python?
  • Python - лучший язык программирования в мире.