Есть ли простой способ удалить элемент списка по значению?

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 сверху.

Ответ 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() принимает только один аргумент, поэтому вы можете удалить только одно целое из списка.