Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 8, 2016 21:09:52

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

удаление элемента из списка

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-ым.
Пришел к выводу, что эту задачу надо решать другим подходом без цикла.



спс всем за ответы.

Отредактировано papuas (Июнь 8, 2016 23:11:48)

Офлайн

#2 Июнь 8, 2016 22:23:28

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

удаление элемента из списка

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 ]

Отредактировано marvellik (Июнь 8, 2016 22:26:22)

Офлайн

#3 Июнь 8, 2016 23:12:33

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

удаление элемента из списка

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

Отредактировано papuas (Июнь 8, 2016 23:13:20)

Офлайн

#4 Июнь 9, 2016 01:59:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

удаление элемента из списка

>>> 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'}]
>>>



Офлайн

#5 Июнь 10, 2016 17:35:51

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

удаление элемента из списка

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'}]


Отредактировано papuas (Июнь 10, 2016 17:42:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version