удалить значение 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 на ключи и значения
  • Почему «return list.sort ()» возвращает None, а не список?
  • Самый быстрый способ подсчета числа вхождений в списке Python
  • Список гарантированно является пустым списком, если список предшествует списку ?
  • Создание списков с циклами в Python
  • проблема компиляции при запуске theano
  • В Python, как я могу найти индекс первого элемента в списке, который НЕ является некоторым значением?
  • Почему список (my_list) изменяет объект?
  • Лучший способ сортировки словаря в группы с использованием Python
  • Проверьте, находятся ли два элемента в списке в определенном порядке?
  •  
    Interesting Posts for Van-Lav

    Как установить Python с Wampserver

    Python TimedRotatingFileHandler не вращается в полночь, пока в файл журнала не будет записано что-то новое. Как это исправить?

    добавление одного и того же объекта дважды в ManyToManyField

    UnicodeDecodeError: кодек ascii не может декодировать байт 0xd1 в позиции 2: порядковый номер не в диапазоне (128)

    Как текстовое найти импортированное имя в модуле

    Ошибки с разверткой numpy при использовании длинных массивов

    Numpy: преобразование массива в треугольную матрицу

    являются генераторами, поддерживаемыми в RPython?

    Использовать строковую переменную ** kwargs как именованный аргумент

    Геометрия макета для древовидных структур / выстраивание узлов привлекательно

    __init__ или __call__?

    Использование PyPDF2 для объединения файлов в несколько выходных файлов

    Как получить описание работы с помощью scrapy?

    matplotlib – извлечение данных из контурных линий

    Как создать простой метакласс?

    Python - лучший язык программирования в мире.