Это был мой источник, с которого я начал.
Мой список
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?
filter
версия:filter(lambda x: x is not None, L)
- Вы могли бы избавиться отlambda
использования,partial
иoperator.is_not
я думаю, но, вероятно, оно того не стоит, так как list-comp намного чище.is_not
существует! Я думал, что это толькоis_
, я собираюсь добавить это просто для удовольствияis_not
существует иnot_in
не существует. Я действительно думаю, что этоnot_in
должно быть превращено в волшебный метод__not_contains__
... посмотрите вопрос, который я задал некоторое время назад, и комментарий, который я сделал ответчику ... и все еще не чувствую, что он решен.filterfalse
или что-то в зависимости отx > y
чтоnot x <= y
в python ничего не подразумевается, потому что вы можете делать что-либо в__lt__
и__le__
, поэтому, почему следуетx not in y
подразумеватьnot x in y
(тем более,not in
что он имеет свой собственный байт-код?)FWIW, Python 3 облегчает эту проблему:
В Python 2 вместо этого вы использовали бы понимание списка:
источник
__ne__
так , как противоположностьpartial
иne
?operator
модуля.__ne__
?x != y
вызывает,x.__ne__(y)
где ne означает «не равно». Таким образом,None.__ne__
это связанный метод, который возвращает True при вызове с любым значением, отличным от None . Например, приbm = None.__ne__
вызове сbm(10)
возвратом возвращается значение NotImplemented, имеющее значение true, иbm(None)
возвращается значение False .Используя понимание списка, это можно сделать следующим образом:
Значение l:
источник
Для Python 2.7 (см. Ответ Раймонда, для эквивалента Python 3):
Желая узнать, является ли что-то «не None» настолько распространенным в python (и других языках OO), что в моем Common.py (который я импортирую в каждый модуль с помощью «из общего импорта *») я включаю следующие строки:
Затем, чтобы удалить элементы None из списка, просто выполните:
Я считаю, что это легче читать, чем соответствующее понимание списка (которое Раймонд показывает, как его версия Python 2).
источник
partial(is_not, None)
это решение. Я считаю, что это будет медленнее (хотя это не слишком важно). Но с парой импортных модулей Python в этом случае не требуется настраиваемая функцияОтвет @jamylak довольно приятный, однако, если вы не хотите импортировать пару модулей просто для выполнения этой простой задачи, напишите свой собственный
lambda
на месте:источник
[x for x in L if x is not None]
другой код был просто дополнением, которое я прямо заявил, что не рекомендуюИтерация против пространства , использование может быть проблемой. В разных ситуациях профилирование может показывать, что оно «быстрее» и / или «меньше памяти».
Первый подход (как и было предложено @jamylak , @Raymond Hettinger и @Dipto ) создает копию списка в памяти, что может быть дорогостоящим для большого списка с несколько
None
записями.Второй подход проходит через список один раз, а затем снова каждый раз , пока не
None
будет достигнут. Это может потребовать меньше памяти, и список будет уменьшаться. Уменьшение размера списка может ускорить появление большого количестваNone
записей в начале, но наихудший случай будет, если многоNone
записей появятся сзади.Параллелизация и методы на месте - это другие подходы, но у каждого есть свои сложности в Python. Знание данных и сценариев использования во время выполнения, а также профилирование программы - это то, с чего начать интенсивную работу или большие данные.
Выбор любого подхода, вероятно, не будет иметь значения в обычных ситуациях. Это становится более предпочтительным обозначением. На самом деле, в этих необычных обстоятельствах
numpy
илиcython
могут быть полезными альтернативами вместо попыток микроуправления оптимизацией Python.источник
L.count(None)
а затем звоните.remove(None)
несколько раз, что делает этоO(N^2)
Ситуация, которую вы пытаетесь решить, не должна рассматриваться таким образом, данные должны быть реструктурированы в базу данных или файл вместо этого, если это слишком интенсивно.O(n^2)
только когда весь список естьNone
.numpy
, можно было бы обработать этот тип операции более оптимизированным способомnumpy
в последние годы, но это отдельный навык. ЕслиL
создается какnumpy.array
вместо Pythonlist
, тоL = L[L != numpy.array(None)]
(stackoverflow.com/a/25255015/3003133), вероятно, лучше, чем любой, но я не знаю подробностей реализации для обработки против памяти ниже. По крайней мере, он создает массив логических значений двойной длины для маски. Таким образом, синтаксис сравнения внутри оператора доступа (индекса) является новым для меня. Эта дискуссия также привлекла мое вниманиеdtype=object
.источник
Если это весь список списков, вы можете изменить ответ 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 >>
источник
Скажите, что список как ниже
Это вернет только те предметы, чьи
bool(item) is True
Это эквивалентно
Чтобы просто отфильтровать None:
Эквивалентно:
Чтобы получить все предметы, которые оценивают как ложные
источник