2015-08-02 2 views
-2

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

"peppers", "cheese", "mushrooms", "bananas", "peppers" 

я могу найти пункт «перец», и изменить его на «пошли!», Но я действительно хочу, чтобы удалить элемент, используя

del blist[idx] 

Но это вызывает ошибку, и я дон Не знаю почему.

myList = ["peppers", "cheese", "mushrooms", "bananas", "peppers"] 

def findInList (needle, haystack): 
    needle = needle.lower() 
    findy = [] 
    # loops over list elements 
    for i in range(0, len(haystack)): 
     temp = haystack[i].lower() 
     idx = temp.find(needle) 
     if (idx != -1): findy.append(i) 
    return findy 

def deleteItemInList(alist, blist): 
    for i in range(0, len(alist)): 
     idx = alist[i] 
     blist[idx] = "Gone!" 
     # del blist[idx] 

# find items in list 
mySearch = findInList("Peppers", myList) 

# remove item from list 
deleteItemInList(mySearch, myList) 

print myList 

Traceback: следующим

Traceback (most recent call last): 
    File "delete_in_list.py", line 23, in <module> 
    deleteItemInList(mySearch, myList) 
    File "delete_in_list.py", line 16, in deleteItemInList 
    blist[idx] = "Gone!" 
IndexError: list assignment index out of range 

Может кто-то перебирать код выше и указать, где я буду неправильно.

+0

Не могли бы вы показать фактический след? – thefourtheye

+0

Как правило, это ужасная идея перебирать список и изменять его в одно и то же время и, как правило, лучше создавать новый список. – NightShadeQueen

+0

@NightShadeQueen Вместо того, чтобы удалять элементы в этой точке цикла, я должен искать все остальные элементы, которые мне нужны, и добавлять их в новый список. –

ответ

0

Я, наконец, понял это! В то время как итерация над списком, удаляющим элементы в списке, я эффективно распиливал ветку, на которой я сидел. Необходимо перевернуть список в обратном направлении:

def deleteItemInList(alist, blist): 
    for i in range(len(alist) -1, -1, -1): 
     idx = alist[i] 
     del blist[idx] 
0

Чтобы найти элемент, используйте эту функцию. Или же просто определить его как обычно:

>>> find = lambda _list, query: [item.lower() for item in _list].index(query.lower()) 

>>> l = ['red', 'pepper'] 
>>> q = 'Pepper' 
>>> find(l, q) 
1 

Чтобы удалить с помощью индекса просто используйте del:

>>> del l[find(l, q)] 
>>> l 
['red'] 
3

Вы можете использовать список понимание для этого.

def removeWord(needle, haystack): 
    return [word for word in haystack if word.lower() != needle.lower()]