Форум сайта python.su
Доброго времени суток.
есть класс:
class t1:
................
self.marked = True # или False
................
for i in xrange(len(t1list)):
..............
Отредактировано (Окт. 10, 2008 08:22:53)
Офлайн
в цикле можно.
но лучше так:
t1list = filter(lambda x: not x.marked, t1list)
Офлайн
точно :) Спасибо
Вот еще про удаление:
в вышеобозначеном классе есть лист … лист из экземпляров таких же классов
так же в классе есть ссылка на своего родителя, то есть на экземпляр. В общем это дерево
Если я делаю
del t1
и этот t1 содержит лист со своими потомками, каждый из которых держит ссылку на этот t1, то t1 не удаляется (не вызывается его __del__). Как в этом случае быть? обходить всех потомков, которые могут тоже содержать потомков?
В общем я не программист, объяснил как-то коряво .. надеюсь понятно
Отредактировано (Окт. 10, 2008 09:00:55)
Офлайн
или так
t1list = [x for x in t1list if not x.marked]
Отредактировано (Окт. 10, 2008 09:08:11)
Офлайн
pyuserА разве так не создается копия листа?
или так
Код:
t1list =
Офлайн
Вот накидал метод. На сколько он правелен для удаления всей ветки дервеа?
def del_branch(self):
while len(self.children) != 0:
self.children[0].del_branch()
del self.children[0]
Отредактировано (Окт. 10, 2008 09:11:47)
Офлайн
iceфункция filter тоже не меняет исходный список :)
А разве так не создается копия листа?
Офлайн
pyuserхмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …
функция filter тоже не меняет исходный список smile
Офлайн
iceтогда цикл :(pyuserхмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …
функция filter тоже не меняет исходный список smile
Офлайн
Вот, что получилось.
но ветку с 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()
Отредактировано (Окт. 10, 2008 09:53:56)
Офлайн