Есть ли простой способ удалить элемент списка по значению?
a = [1, 2, 3, 4]
b = a.index(6)
del a[b]
print a
Выше показана следующая ошибка:
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 6, in <module>
b = a.index(6)
ValueError: list.index(x): x not in list
Так что я должен сделать это:
a = [1, 2, 3, 4]
try:
b = a.index(6)
del a[b]
except:
pass
print a
Но нет ли более простого способа сделать это?
Ответы
Ответ 1
Чтобы удалить первое вхождение элемента в список, просто используйте list.remove
:
>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print a
['a', 'c', 'd']
Имейте в виду, что он не удаляет все вхождения вашего элемента. Для этого используйте понимание списка.
>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print a
[10, 30, 40, 30, 40, 70]
Ответ 2
Обычно Python будет генерировать исключение, если вы скажете ему сделать что-то, чего он не может, поэтому вам придется делать это:
if c in a:
a.remove(c)
или
try:
a.remove(c)
except ValueError:
pass
Исключение не обязательно является плохим, если вы его ожидаете и обрабатываете должным образом.
Ответ 3
Вы можете сделать
a=[1,2,3,4]
if 6 in a:
a.remove(6)
но выше нужно искать 6 в списке в 2 раза, поэтому попробуйте, но будет быстрее
try:
a.remove(6)
except:
pass
Ответ 4
Рассмотрим:
a = [1,2,2,3,4,5]
Чтобы вывести все вхождения, вы можете использовать функцию фильтра в python.
Например, это будет выглядеть так:
a = list(filter(lambda x: x!= 2, a))
Таким образом, он сохранит все элементы a!= 2.
Чтобы просто взять один из элементов, используйте
a.remove(2)
Ответ 5
Здесь, как это сделать inplace (без понимания списка):
def remove_all(seq, value):
pos = 0
for item in seq:
if item != value:
seq[pos] = item
pos += 1
del seq[pos:]
Ответ 6
Если вы знаете, какое значение нужно удалить, вот простой способ (как бы я ни думал, во всяком случае):
a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
a.remove(1)
Вы получите
[0, 0, 2, 3, 4]
Ответ 7
Другая возможность - использовать набор вместо списка, если набор применим в вашем приложении.
IE, если ваши данные не упорядочены и не имеют дубликатов, затем
my_set=set([3,4,2])
my_set.discard(1)
является безошибочным.
Часто список - это просто удобный контейнер для предметов, которые на самом деле неупорядочены. Есть вопросы о том, как удалить все вхождения элемента из списка. Если вы не хотите обманывать в первую очередь, еще раз удобнее.
my_set.add(3)
не меняет my_set сверху.
Ответ 8
Как указано во многих других ответах, list.remove()
будет работать, но list.remove()
ValueError
если элемент не был в списке. В python 3. 4+ есть интересный подход к решению этой проблемы с использованием подавляющего контекстного менеджера:
from contextlib import suppress
with suppress(ValueError):
a.remove('b')
Ответ 9
Поиск значения в списке, а затем удаление этого индекса (если он существует) проще сделать, просто используя метод удаления списка:
>>> a = [1, 2, 3, 4]
>>> try:
... a.remove(6)
... except ValueError:
... pass
...
>>> print a
[1, 2, 3, 4]
>>> try:
... a.remove(3)
... except ValueError:
... pass
...
>>> print a
[1, 2, 4]
Если вы это часто делаете, вы можете завершить его в функции:
def remove_if_exists(L, value):
try:
L.remove(value)
except ValueError:
pass
Ответ 10
Этот пример выполняется быстро и удалит все экземпляры значения из списка:
a = [1,2,3,1,2,3,4]
while True:
try:
a.remove(3)
except:
break
print a
>>> [1, 2, 1, 2, 4]
Ответ 11
Если ваши элементы различны, тогда будет выполняться простая разница в настройках.
c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]
Ответ 12
В одну строку:
a.remove('b') if 'b' in a else None
иногда это полезно.
Еще проще:
if 'b' in a: a.remove('b')
Ответ 13
Мы также можем использовать .pop:
>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
... lst.pop(lst.index(remove_element))
...
23
>>> lst
[34, 54, 45]
>>>
Ответ 14
Перезаписать список, указав все, кроме элементов, которые вы хотите удалить.
>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]
Ответ 15
С циклом for и условием:
def cleaner(seq, value):
temp = []
for number in seq:
if number != value:
temp.append(number)
return temp
И если вы хотите удалить некоторые, но не все:
def cleaner(seq, value, occ):
temp = []
for number in seq:
if number == value and occ:
occ -= 1
continue
else:
temp.append(number)
return temp
Ответ 16
list1=[1,2,3,3,4,5,6,1,3,4,5]
n=int(input('enter number'))
while n in list1:
list1.remove(n)
print(list1)
Ответ 17
Скажем, например, мы хотим удалить все 1 из x. Вот как я это сделаю:
x = [1, 2, 3, 1, 2, 3]
Теперь это практическое использование моего метода:
def Function(List, Unwanted):
[List.remove(Unwanted) for Item in range(List.count(Unwanted))]
return List
x = Function(x, 1)
print(x)
И это мой метод в одной строке:
[x.remove(1) for Item in range(x.count(1))]
print(x)
Оба дают это как результат:
[2, 3, 2, 3, 2, 3]
Надеюсь, это поможет.
PS, пожалуйста, обратите внимание, что это было написано в версии 3.6.2, поэтому вам может потребоваться настроить его для более старых версий.
Ответ 18
Может быть, ваши решения работают с целочисленными, но у меня не работает со словарями.
С одной стороны, удаление() не работает для меня. Но, возможно, это работает с основными типами. Я предполагаю, что приведенный ниже код также является способом удаления элементов из списка объектов.
С другой стороны, "del" тоже не работает должным образом. В моем случае, с использованием python 3.6: когда я пытаюсь удалить элемент из списка с помощью команды "for" с помощью команды "del", python изменяет индекс в процессе, и bucle останавливается преждевременно до истечения времени. Это работает, только если Вы удаляете элемент за элементом в обратном порядке. Таким образом, вы не изменяете индекс массива ожидающих элементов, когда проходите его
Затем я использовал:
c = len(list)-1
for element in (reversed(list)):
if condition(element):
del list[c]
c -= 1
print(list)
где 'list' похож на [{'key1': value1 '}, {' key2 ': value2}, {' key3 ': value3},...]
Также Вы можете сделать больше pythonic используя перечисление:
for i, element in enumerate(reversed(list)):
if condition(element):
del list[(i+1)*-1]
print(list)
Ответ 19
arr = [1, 1, 3, 4, 5, 2, 4, 3]
# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)
# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]
# if you want to delete a position use "pop" function, suppose
# position 4
# the pop function also returns a value
removed_element = arr.pop(4)
# u can also use "del" to delete a position
del arr[4]
Ответ 20
Это удаляет все экземпляры "-v"
из массива sys.argv
и не sys.argv
жалоб, если не найдено ни одного экземпляра:
while "-v" in sys.argv:
sys.argv.remove('-v')
Вы можете увидеть код в действии в файле speechToText.py
:
$ python speechToText.py -v
['speechToText.py']
$ python speechToText.py -x
['speechToText.py', '-x']
$ python speechToText.py -v -v
['speechToText.py']
$ python speechToText.py -v -v -x
['speechToText.py', '-x']
Ответ 21
синтаксис: lst.remove(x)
lst = ['one', 'two', 'three', 'four', 'two']
lst.remove('two') #it will remove first occurence of 'two' in a given list
del lst[2] #delete item by index value
print(lst)
Ответ 22
это мой ответ, просто используйте , а и для
def remove_all(data, value):
i = j = 0
while j < len(data):
if data[j] == value:
j += 1
continue
data[i] = data[j]
i += 1
j += 1
for x in range(j - i):
data.pop()
Ответ 23
Да. Это то, что я нашел наиболее полезным:
import sys
a = [1, 2, 3, 4]
y = 0
if y < 1:
a.remove(1)
print len(a)
else:
sys.exit()
Теперь .remove()
принимает только один аргумент, поэтому вы можете удалить только одно целое из списка.