Найти - Пользователи
Полная версия: удаление элемента из списка
Начало » Python для новичков » удаление элемента из списка
1 2
papuas
FishHook
Да нельзя так делать! Не получишь ты правильного результата удаляя из списка в цикле.
После того, как ты удалишь нулевой элемент, первый элемент станет нулевым, второй первым и так далее.
Поэтому, когда ты удаляешь последовательно 0, 1 и 2-й элементы, ты удалишь 0, 2 и 4-й.
Попробуй выполни свой код и увидишь, что он не работает.
Не успел ответить был занят, разобрался:

>>> a = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
>>> var = [0,1,2]
>>> for i, o in enumerate(var):
...     del a[i]
...     print i,o,a
...
0 0 [{'c2': 'www'}, {'c3': 'eee'}, {'c4': 'rrr'}, {'c5': 'ttt'}]
1 1 [{'c2': 'www'}, {'c4': 'rrr'}, {'c5': 'ttt'}]
2 2 [{'c2': 'www'}, {'c4': 'rrr'}]
Человек истину глаголит, так делать нельзя.
После первой итерации список съезжает и 1 элемент становится 0-ым.
Пришел к выводу, что эту задачу надо решать другим подходом без цикла.



спс всем за ответы.
marvellik
papuas
Пришел к выводу, что эту задачу надо решать другим подходом без цикла.
так решение то не рабочее. что тут делается? берется индекс элементов из var (именно индекс а не значения) и пытаетесь удалить элемент в списке а по индексу тем самым опять
FishHook
После того, как ты удалишь нулевой элемент, первый элемент станет нулевым, второй первым и так далее.

>>> a = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
>>> var = [0,1,2]
>>> for i, o in enumerate(var):
...     del a[i]
var = [1,3,4] >>> [{'c2': 'www'}, {'c4': 'rrr'}]
var = [0,2,3] >>> [{'c2': 'www'}, {'c4': 'rrr'}]
var = [2,3,4] >>> [{'c2': 'www'}, {'c4': 'rrr'}]
зачем что то удалять если можно изменить список не включая в него элементы индексы которых прописаны в var
a = [ i for x,i in enumerate(a) if x not in var ]
papuas
marvellik
так решение то не рабочее. что тут делается? берется индекс элементов из var (именно индекс а не значения) и пытаетесь удалить элемент в списке а по индексу тем самым опять
papuas
Человек истину глаголит, так делать нельзя.
После первой итерации список съезжает и 1 элемент становится 0-ым.
Пришел к выводу, что эту задачу надо решать другим подходом без цикла.
py.user.next
>>> lst = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
>>> idx = [0, 1, 2]
>>> 
>>> out = [e for i, e in enumerate(lst) if i not in idx]
>>> out
[{'c4': 'rrr'}, {'c5': 'ttt'}]
>>>
papuas
FishHook
Ваша задача решается не удалением из списка, а созданием нового списка, на основе старого

a = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
var = [0,1,2]
a = [el for index, el in enumerate(a) if index in var]

или так

a = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
var = [0,1,2]
a = [a[i] for i in var]
не совсем то
>>> a
[{'c1': 'qqq'}, {'c2': 'www'}, {'c3': 'eee'}]


а это верное
marvellik
я правильно понял удалить из списка элементы с индексами заданными в списке var?
тогда мне кажется так и в одну строку

a = [ i for x,i in enumerate(a) if x not in var ]
>>> [{'c4': 'rrr'}, {'c5': 'ttt'}]

и это
py.user.next
>>> lst = [{'c1':'qqq'},{'c2':'www'},{'c3':'eee'},{'c4':'rrr'},{'c5':'ttt'}]
>>> idx = [0, 1, 2]
>>>
>>> out = [e for i, e in enumerate(lst) if i not in idx] >>> out [{'c4': 'rrr'}, {'c5': 'ttt'}]
>>>
>>> out
[{'c4': 'rrr'}, {'c5': 'ttt'}]


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB