Как фильтровать число & ldquo; 0 & rdquo; из этого списка? [Дубликат]

Для тех, что предыдущие ответы не помогли ... вот что было МОЙ ПРОБЛЕМ !!!

привязка param была «динамической», поэтому у меня была переменная, которая задает параметры данных для использования bind_param. Так что переменная была неправильной, но вместо того, чтобы бросать ошибку, например, «неверные данные параметров», она говорит «вне синхронизации bla bla bla», поэтому я был смущен ...

Надеюсь, это помогло кому-то!

254
задан martineau 21 June 2017 в 17:12
поделиться

20 ответов

Функциональный подход:

2.x

>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]

3.x

>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]

или

>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
348
ответ дан Monit Gehlot 15 August 2018 в 20:04
поделиться
  • 1
    Используйте понимание списка по фильтру + лямбда; первая более читаема в дополнение к обычно более эффективной. – habnabit 21 July 2009 в 05:28
  • 2
    s / вообще / обычно / – habnabit 21 July 2009 в 05:29
  • 3
    Код для предложения habnabit выглядит следующим образом: [y for y in x if y != 2] – CoreDumpError 22 April 2013 в 23:12
  • 4
    Я бы не назвал это решение лучшим. Учет списков быстрее и проще для понимания, просматривая код. Это скорее будет скорее Perl, чем Python. – Peter Nimroot 13 August 2016 в 15:25
  • 5
    -1 для прямого вызова __ne__. Сравнение двух значений является гораздо более сложным процессом, чем просто вызов __eq__ или __ne__ на одном из них. Он может работать правильно здесь, потому что вы только сравниваете числа, но в общем случае это неверно и ошибка. – Aran-Fey 4 June 2018 в 07:11

Вы можете использовать назначение среза, если исходный список должен быть изменен, но при этом используется эффективное понимание списка (или выражение генератора).

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
82
ответ дан A. Coady 15 August 2018 в 20:04
поделиться
  • 1
    Это то, что фильтр делает правильно. – riza 21 July 2009 в 04:36
  • 2
    @Selinap: фильтр не изменяет список, он возвращает новый список. – E.M. 21 July 2009 в 04:47
  • 3
    фильтры и списки не изменяют список. выбор среза. и оригинальный пример. – A. Coady 23 July 2009 в 00:24
  • 4
    Мне это нравится, потому что он изменяет список, к которому относится х. Если есть другие ссылки на этот список, они также будут затронуты. Это контрастирует с предложениями x = [ v for v in x if x != 2 ], которые создают новый список и меняют x, чтобы ссылаться на него, оставляя исходный список нетронутым. – Hannes 7 September 2016 в 05:06

Повторение решения первого сообщения более абстрактным образом:

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]
23
ответ дан funk 15 August 2018 в 20:04
поделиться

Чтобы удалить все повторяющиеся вхождения и оставить одно в списке:

test = [1, 1, 2, 3]

newlist = list(set(test))

print newlist

[1, 2, 3]

Вот функция, которую я использовал для Project Euler:

def removeOccurrences(e):
  return list(set(e))
3
ответ дан Jared Burrows 15 August 2018 в 20:04
поделиться
  • 1
    Мне нужно было сделать это на векторе с 250 тыс. Значений, и он работает как шарм. – rschwieb 1 March 2013 в 02:13
  • 2
    Ответ: да! И я полностью понимаю, если есть вектор, который долго звучит совершенно безумно для грамотного программиста. Я подхожу к проблемам там как математик, не беспокоясь об оптимизации решений, и это может привести к более длинным решениям, чем пар. (Хотя у меня нет терпения для решений более 5 минут.) – rschwieb 1 March 2013 в 16:08
  • 3
    Это приведет к удалению любого заказа из списка. – asmeurer 16 July 2013 в 23:03
  • 4
    @JaredBurrows возможно потому, что он не отвечает на вопрос, как он сейчас стоит, но совсем другой вопрос. – drevicko 15 June 2014 в 12:47
  • 5
    -1, это не ответ на вопрос ОП. Это решение для удаления дубликатов, что совершенно другое дело. – Anoyz 22 July 2016 в 11:18

По соображениям удобочитаемости я думаю, что эта версия немного быстрее, так как она не заставляет время пересматривать список, тем самым делая точно такую ​​же работу, что и в любом случае:

x = [1, 2, 3, 4, 2, 2, 3]
def remove_values_from_list(the_list, val):
    for i in range(the_list.count(val)):
        the_list.remove(val)

remove_values_from_list(x, 2)

print(x)
5
ответ дан Martin Andersson 15 August 2018 в 20:04
поделиться
  • 1
    Для списка, который вы показываете в коде, этот подход примерно на 36% медленнее, чем метод понимания списка (который возвращает копию), согласно моим измерениям. – djsmith 14 October 2012 в 04:55
  • 2
    Хорошо, что вы это заметили. Однако, поскольку я думаю, что это, возможно, сузило ваше мнение, я сравнивал свою версию с самым первым предложением автора вопроса. – Martin Andersson 15 October 2012 в 09:01

Вы можете использовать понимание списка:

def remove_values_from_list(the_list, val):
   return [value for value in the_list if value != val]

x = [1, 2, 3, 4, 2, 2, 3]
x = remove_values_from_list(x, 2)
print x
# [1, 3, 4, 3]
161
ответ дан mhawke 15 August 2018 в 20:04
поделиться
  • 1
    Как бы вы удалили предметы, не проверив их? – Alexander Ljungberg 21 July 2009 в 04:20
  • 2
    Это не изменяет исходный список, но возвращает новый список. – John Y 21 July 2009 в 04:20
  • 3
    @Selinap: Нет, это оптимально, поскольку он просматривает список только один раз. В вашем исходном коде оба оператора in и remove просматривают весь список (вплоть до того, как они находят совпадение), поэтому вы в конечном итоге просматриваете список несколько раз таким образом. – John Kugelman 21 July 2009 в 04:24
  • 4
    @mhawke, @John Y: просто используйте x [:] = ... вместо x = и он будет "in-place & quot; вместо того, чтобы просто переписывать имя «x» (скорость практически одинакова и МНОГО быстрее, чем x.remove может быть !!!). – Alex Martelli 21 July 2009 в 04:33
  • 5
    Я проголосую за это, потому что после 6 лет Python я все еще не понимаю Lambdas :) – Benjamin 29 September 2012 в 11:47

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

category_ids.sort()
ones_last_index = category_ids.count('1')
del category_ids[0:ones_last_index]
2
ответ дан Michael Clemmons 15 August 2018 в 20:04
поделиться
  • 1
    Я понимаю, куда вы идете, но этот код не будет работать, так как вам нужен также начальный индекс, а не только 0. – Shedokan 27 April 2013 в 11:31

Все ответы выше (кроме Мартина Андерсона) создают новый список без нужных элементов, а не удаляют элементы из исходного списка.

>>> import random, timeit
>>> a = list(range(5)) * 1000
>>> random.shuffle(a)

>>> b = a
>>> print(b is a)
True

>>> b = [x for x in b if x != 0]
>>> print(b is a)
False
>>> b.count(0)
0
>>> a.count(0)
1000

>>> b = a
>>> b = filter(lambda a: a != 2, x)
>>> print(b is a)
False

Это может быть важно, если у вас есть другие ссылки на список, висящий вокруг.

Чтобы изменить список на месте, используйте такой метод

>>> def removeall_inplace(x, l):
...     for _ in xrange(l.count(x)):
...         l.remove(x)
...
>>> removeall_inplace(0, b)
>>> b is a
True
>>> a.count(0)
0

Что касается скорости, то результаты на моем ноутбуке (все в списке записей 5000 с удаленным 1000 записей)

  • Понимание списка - ~ 400us
  • Фильтр - ~ 900us
  • .remove () loop - 50ms

Таким образом, цикл .remove примерно на 100x медленнее ........ Хм, возможно, необходим другой подход. Самое быстрое, что я нашел, это использование списка, но затем замените содержимое исходного списка.

>>> def removeall_replace(x, l):
....    t = [y for y in l if y != x]
....    del l[:]
....    l.extend(t)
  • removeall_replace () - 450us
8
ответ дан Paul S 15 August 2018 в 20:04
поделиться
  • 1
    Почему бы не просто переназначить новый список по старому адресу? def remove_all(x, l): return [y for y in l if y != x], тогда l = remove_all(3,l) – Dannid 1 March 2016 в 18:58
  • 2
    @Dannid Это второй метод в первом поле кода. Он создает новый список, и вы не изменяете старый список. Любые другие ссылки на список останутся нефильтрованными. – Paul S 10 March 2016 в 18:25
  • 3
    Ах, да. Я настолько увлекся определением метода, я упустил простую задачу, которую вы уже сделали. – Dannid 14 March 2016 в 22:19

См. простые решения Решение 1:

>>> [i for i in x if i != 2]

Это вернет список, содержащий все элементы из x без 2 Решение 2:

>>> while 2 in x : x.remove(2)
9
ответ дан Shameem 15 August 2018 в 20:04
поделиться
  • 1
    Оба этих решения уже опубликованы. Много лет назад. – Aran-Fey 5 August 2018 в 07:34

вы можете это сделать

while 2 in x:   
    x.remove(2)
4
ответ дан Tempux 15 August 2018 в 20:04
поделиться
  • 1
    это не устраняет все вхождения – Hamlett 19 September 2016 в 19:36
  • 2
    @Hamlet: пожалуйста, объясните, почему он не удалит все случаи из 2, потому что мне трудно понять, почему это не будет ... oO – Guillaume 3 November 2016 в 17:29
  • 3
    @Guillaume, он был отредактирован, "while 2 in x & quot; не был частью кода. Теперь это так, и код кажется правильным. upvote;) – Hamlett 21 November 2016 в 14:38
  • 4
    Хорошо спасибо, я понимаю сейчас :) Это самый читаемый и лаконичный ответ IMHO – Guillaume 21 November 2016 в 14:48
  • 5
    Это плохое решение, так как список должен быть пройден 2 * n раз для n вхождений 2. – cxxl 25 November 2016 в 15:55
for i in range(a.count(' ')):
    a.remove(' ')

Намного проще.

0
ответ дан Alex Gyoshev 15 August 2018 в 20:04
поделиться
  • 1
    отредактируйте свой ответ, чтобы улучшить ясность. Пожалуйста, дайте понять, что именно делает ваш рекомендуемый код, почему он работает и почему это ваша рекомендация. Пожалуйста, также правильно отформатируйте свой вопрос, чтобы код был четко различим с остальной частью вашего ответа. – Ortund 3 November 2016 в 15:39
mylist=list(set(mylist))
mylist.remove(element)

Возможно, не самый пифонический, но все же самый легкий для меня haha ​​

0
ответ дан Ankit Sharma 15 August 2018 в 20:04
поделиться

Если у вас не было встроенного filter или вы не хотите использовать дополнительное пространство, и вам нужно линейное решение ...

def remove_all(A, v):
    k = 0
    n = len(A)
    for i in range(n):
        if A[i] !=  v:
            A[k] = A[i]
            k += 1

    A = A[:k]
0
ответ дан cipher 15 August 2018 в 20:04
поделиться

Что случилось с:

Motor = ['1', '2', '2'] Для i в двигателе: Если i! = '2': Печать (i) Печать (двигатель)

Использование anaconda

0
ответ дан code developer 15 August 2018 в 20:04
поделиться
  • 1
    Пожалуйста, объясните свои строки кода, чтобы другие пользователи могли понять его функциональность. Благодаря! – Ignacio Ara 25 April 2018 в 09:19

Удалить все вхождения значения из списка Python

lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list():
    for list in lists:
      if(list!=7):
         print(list)
remove_values_from_list()

Результат: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

В качестве альтернативы,

lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list(remove):
    for list in lists:
      if(list!=remove):
        print(list)
remove_values_from_list(7)

Результат: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

1
ответ дан Ivan 15 August 2018 в 20:04
поделиться
  • 1
    «Python» вложен в каждый цикл if внутри функции, работающей со 100% точностью! ». – rafiqul786 1 April 2016 в 07:05
  • 2
    Вы не изменяете список, который вы просто печатаете. Именование списка в списках путается – kon psych 31 May 2016 в 04:48

Подход Nump и тайминги к списку / массиву с 1.000.000 элементами:

Сроки:

In [10]: a.shape
Out[10]: (1000000,)

In [13]: len(lst)
Out[13]: 1000000

In [18]: %timeit a[a != 2]
100 loops, best of 3: 2.94 ms per loop

In [19]: %timeit [x for x in lst if x != 2]
10 loops, best of 3: 79.7 ms per loop

Заключение: numpy в 27 раз быстрее (на моем ноутбуке) сравнивается для перечисления подхода к пониманию

PS, если вы хотите преобразовать свой обычный список Python lst в массив numpy:

arr = np.array(lst)

Настройка:

import numpy as np
a = np.random.randint(0, 1000, 10**6)

In [10]: a.shape
Out[10]: (1000000,)

In [12]: lst = a.tolist()

In [13]: len(lst)
Out[13]: 1000000

Проверьте:

In [14]: a[a != 2].shape
Out[14]: (998949,)

In [15]: len([x for x in lst if x != 2])
Out[15]: 998949
2
ответ дан MaxU 15 August 2018 в 20:04
поделиться

Первое решение, используя фильтр. Второе решение, используя понимание списка.

#If we want to remove all 2.
ls = [2, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 6, 2]

# 1-filter takes two arguments(condition,sequence)
   ls = list(filter(lambda x: x != 2, ls))

# 2-list comprehension
   ls = [x for x in ls if x != 2]
0
ответ дан Maz1978 15 August 2018 в 20:04
поделиться

О скорости!

import time
s_time = time.time()

print 'start'
a = range(100000000)
del a[:]
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 3.25

s_time = time.time()
print 'start'
a = range(100000000)
a = []
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 2.11
-1
ответ дан Sergey Kozlovskiy 15 August 2018 в 20:04
поделиться

Изменяет ли это список?

>>> x=[1,2,3,4,5,6,7,8]
>>> x
[1, 2, 3, 4, 5, 6, 7, 8]
>>> x = [val for val in x if val not in [2,3,4]]
>>> x
[1, 5, 6, 7, 8]
0
ответ дан Stephen Boston 15 August 2018 в 20:04
поделиться
p=[2,3,4,4,4]
p.clear()
print(p)
[]

Только с Python 3

-2
ответ дан Zulu 15 August 2018 в 20:04
поделиться
  • 1
    Как ни странно, это входит в сферу рассматриваемого вопроса и является правильным. – Erich 28 August 2017 в 22:26
Другие вопросы по тегам:

Похожие вопросы: