Форум сайта python.su
6
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'}]
Отредактировано papuas (Июнь 8, 2016 23:11:48)
Офлайн
73
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'}]
a = [ i for x,i in enumerate(a) if x not in var ]
Отредактировано marvellik (Июнь 8, 2016 22:26:22)
Офлайн
6
marvellik
так решение то не рабочее. что тут делается? берется индекс элементов из var (именно индекс а не значения) и пытаетесь удалить элемент в списке а по индексу тем самым опять
papuas
Человек истину глаголит, так делать нельзя.
После первой итерации список съезжает и 1 элемент становится 0-ым.
Пришел к выводу, что эту задачу надо решать другим подходом без цикла.
Отредактировано papuas (Июнь 8, 2016 23:13:20)
Офлайн
857
>>> 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'}] >>>
Офлайн
6
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)
Офлайн