Как удалить конкретный элемент из списка?

#python #list #loops #for-loop

Вопрос:

Я пытаюсь удалить спам из заданных вариантов в меню, мой for цикл не работает.

 menu = [
    ["egg", "bacon"],
    ["egg", "sausage", "bacon"],
    ["egg", "spam"],
    ["egg", "bacon", "spam"],
    ["egg", "bacon", "sausage", "spam"],
    ["spam", "bacon", "sausage", "spam"],
    ["spam", "sausage", "spam", "bacon", "spam", "tomato", 
    "spam"],
    ["spam", "egg", "spam", "spam", "bacon", "spam"],
]

for choice in menu:
    if "spam" in choice:
        remove("spam")
        print(choice)
 

Комментарии:

1. Пожалуйста, обновите свой вопрос с помощью полной обратной трассировки ошибок.

2. «удалить» не определено. Может быть, вы имели в виду choice.remove("spam") ?

3. См. Документацию о методе изменяемой последовательности remove() .

Ответ №1:

Как указано @h4z4, remove не определено. Попробуй

 for choice in menu:
    if "spam" in choice:
        choice.remove("spam")
        print(choice)
 

Однако remove удаляется только первое вхождение. Чтобы удалить все вхождения, попробуйте:

 for choice in menu:
    if "spam" in choice:
        choice = [item for item in choice if item != "spam"]
        print(choice)
 

Ответ №2:

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

 menu = [
    ["egg", "bacon"],
    ["egg", "sausage", "bacon"],
    ["egg", "spam"],
    ["egg", "bacon", "spam"],
    ["egg", "bacon", "sausage", "spam"],
    ["spam", "bacon", "sausage", "spam"],
    ["spam", "sausage", "spam", "bacon", "spam", "tomato", "spam"],
    ["spam", "egg", "spam", "spam", "bacon", "spam"],
]

menu = [[val for val in subl if val != "spam"] for subl in menu]
print(menu)
 

С принтами:

 [['egg', 'bacon'], 
 ['egg', 'sausage', 'bacon'], 
 ['egg'], 
 ['egg', 'bacon'], 
 ['egg', 'bacon', 'sausage'], 
 ['bacon', 'sausage'], 
 ['sausage', 'bacon', 'tomato'], 
 ['egg', 'bacon']]
 

Ответ №3:

  1. Как уже указывалось, remove это метод list и должен называться как choice.remove("spam")
  2. remove удаляет только первое вхождение элемента

Вот способ сделать это с remove помощью и count

Код:

 menu = [
    ["egg", "bacon"],
    ["egg", "sausage", "bacon"],
    ["egg", "spam"],
    ["egg", "bacon", "spam"],
    ["egg", "bacon", "sausage", "spam"],
    ["spam", "bacon", "sausage", "spam"],
    ["spam", "sausage", "spam", "bacon", "spam", "tomato",
    "spam"],
    ["spam", "egg", "spam", "spam", "bacon", "spam"],
]

for choice in menu:
    c = choice.count('spam') # returns number of occurrences of 'spam' in choice
    while c: # to remove spam from choice c times
        choice.remove("spam")
        c-=1

print(*menu, sep='n')
 

Выход:

 ['egg', 'bacon']
['egg', 'sausage', 'bacon']
['egg']
['egg', 'bacon']
['egg', 'bacon', 'sausage']
['bacon', 'sausage']
['sausage', 'bacon', 'tomato']
['egg', 'bacon']
 

Но я бы предпочел понимание списка