Найти - Пользователи
Полная версия: Лист с объектами и удаление по признаку.
Начало » Python для экспертов » Лист с объектами и удаление по признаку.
1
ice
Доброго времени суток.

есть класс:

class t1:
................
self.marked = True # или False
................
есть лист из экземпляров этого класса t1list

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

в цикле
for i in xrange(len(t1list)): 
..............
нельзя, на сколько понимаю

неужели нужно делать копию? просто лист очень не маленький может быть и копию тут ну совсем не хочется, тем более на телефоне, где памяти и так не много.

Спасибо.
Dimka665
в цикле можно.

но лучше так:

t1list = filter(lambda x: not x.marked, t1list)
ice
точно :) Спасибо

Вот еще про удаление:

в вышеобозначеном классе есть лист … лист из экземпляров таких же классов
так же в классе есть ссылка на своего родителя, то есть на экземпляр. В общем это дерево

Если я делаю
del t1

и этот t1 содержит лист со своими потомками, каждый из которых держит ссылку на этот t1, то t1 не удаляется (не вызывается его __del__). Как в этом случае быть? обходить всех потомков, которые могут тоже содержать потомков?

В общем я не программист, объяснил как-то коряво .. надеюсь понятно
pyuser
или так
t1list = [x for x in t1list if not x.marked]
алгоритмы работы со структурами данных можно посмотреть в инете :)
http://www.google.ru/search?complete=1&hl=en&newwindow=1&rlz=1B3GGGL_ruRU226RU226&q=%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B+%D0%B8+%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&btnG=Search&aq=f&oq=
ice
pyuser
или так
Код:

t1list =
А разве так не создается копия листа?

рад видеть читинца на этом форуме :) 17 лет в Чите прожил
ice
Вот накидал метод. На сколько он правелен для удаления всей ветки дервеа?

    def del_branch(self):
while len(self.children) != 0:
self.children[0].del_branch()
del self.children[0]
pyuser
ice
А разве так не создается копия листа?
функция filter тоже не меняет исходный список :)
ice
pyuser
функция filter тоже не меняет исходный список smile
хмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …
pyuser
ice
pyuser
функция filter тоже не меняет исходный список smile
хмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …
тогда цикл :(
идем по списку от конца к началу и удаляем ненужные элементы
ice
Вот, что получилось.
но ветку с 500 уровнями вложенности по 10 подуровней каждый довольно долго удаляет. Хотя, полагаю, на файловой системе такого хлама не будет :)

    def del_marked(self):
delshift = 0
listlen = len(self.children)
while listlen > delshift:
if self.children[delshift].marked:
self.children[delshift].del_branch()
del self.children[delshift]
listlen -= 1
else:
self.children[delshift].del_marked()
delshift += 1
self.reorder()
PS: А что тут подсветку синтаксиса в теге code отломали? не могу никак сделать
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