Для тех, что предыдущие ответы не помогли ... вот что было МОЙ ПРОБЛЕМ !!!
привязка param была «динамической», поэтому у меня была переменная, которая задает параметры данных для использования bind_param. Так что переменная была неправильной, но вместо того, чтобы бросать ошибку, например, «неверные данные параметров», она говорит «вне синхронизации bla bla bla», поэтому я был смущен ...
Надеюсь, это помогло кому-то!
Функциональный подход:
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]
Вы можете использовать назначение среза, если исходный список должен быть изменен, но при этом используется эффективное понимание списка (или выражение генератора).
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
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]
Чтобы удалить все повторяющиеся вхождения и оставить одно в списке:
test = [1, 1, 2, 3]
newlist = list(set(test))
print newlist
[1, 2, 3]
Вот функция, которую я использовал для Project Euler:
def removeOccurrences(e):
return list(set(e))
По соображениям удобочитаемости я думаю, что эта версия немного быстрее, так как она не заставляет время пересматривать список, тем самым делая точно такую же работу, что и в любом случае:
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)
Вы можете использовать понимание списка:
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]
in
и remove
просматривают весь список (вплоть до того, как они находят совпадение), поэтому вы в конечном итоге просматриваете список несколько раз таким образом.
– John Kugelman
21 July 2009 в 04:24
Я полагаю, что это, вероятно, быстрее, чем любой другой способ, если вам не нужен порядок списков, если вы позаботились о конечном порядке, сохраните индексы с оригинала и прибегайте к этому.
category_ids.sort()
ones_last_index = category_ids.count('1')
del category_ids[0:ones_last_index]
Все ответы выше (кроме Мартина Андерсона) создают новый список без нужных элементов, а не удаляют элементы из исходного списка.
>>> 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 записей)
Таким образом, цикл .remove примерно на 100x медленнее ........ Хм, возможно, необходим другой подход. Самое быстрое, что я нашел, это использование списка, но затем замените содержимое исходного списка.
>>> def removeall_replace(x, l):
.... t = [y for y in l if y != x]
.... del l[:]
.... l.extend(t)
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
См. простые решения Решение 1:
>>> [i for i in x if i != 2]
Это вернет список, содержащий все элементы из x
без 2
Решение 2:
>>> while 2 in x : x.remove(2)
вы можете это сделать
while 2 in x:
x.remove(2)
for i in range(a.count(' ')):
a.remove(' ')
Намного проще.
mylist=list(set(mylist))
mylist.remove(element)
Возможно, не самый пифонический, но все же самый легкий для меня haha
blockquote>
Если у вас не было встроенного 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]
Что случилось с:
Motor = ['1', '2', '2'] Для i в двигателе: Если i! = '2': Печать (i) Печать (двигатель)
Использование anaconda
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
Подход 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
Первое решение, используя фильтр. Второе решение, используя понимание списка.
#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]
О скорости!
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
Изменяет ли это список?
>>> 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]
p=[2,3,4,4,4]
p.clear()
print(p)
[]
Только с Python 3
[y for y in x if y != 2]
– CoreDumpError 22 April 2013 в 23:12__ne__
. Сравнение двух значений является гораздо более сложным процессом, чем просто вызов__eq__
или__ne__
на одном из них. Он может работать правильно здесь, потому что вы только сравниваете числа, но в общем случае это неверно и ошибка. – Aran-Fey 4 June 2018 в 07:11