Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2008 08:22:03

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

Доброго времени суток.

есть класс:

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

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

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

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

Спасибо.



Отредактировано (Окт. 10, 2008 08:22:53)

Офлайн

#2 Окт. 10, 2008 08:27:25

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

в цикле можно.

но лучше так:

t1list = filter(lambda x: not x.marked, t1list)



Офлайн

#3 Окт. 10, 2008 08:46:15

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

точно :) Спасибо

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

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

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

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

В общем я не программист, объяснил как-то коряво .. надеюсь понятно



Отредактировано (Окт. 10, 2008 09:00:55)

Офлайн

#4 Окт. 10, 2008 08:48:47

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

или так

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=



Отредактировано (Окт. 10, 2008 09:08:11)

Офлайн

#5 Окт. 10, 2008 08:53:50

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

pyuser
или так
Код:

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

рад видеть читинца на этом форуме :) 17 лет в Чите прожил



Офлайн

#6 Окт. 10, 2008 09:10:30

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

Вот накидал метод. На сколько он правелен для удаления всей ветки дервеа?

    def del_branch(self):
while len(self.children) != 0:
self.children[0].del_branch()
del self.children[0]



Отредактировано (Окт. 10, 2008 09:11:47)

Офлайн

#7 Окт. 10, 2008 09:10:35

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

ice
А разве так не создается копия листа?
функция filter тоже не меняет исходный список :)



Офлайн

#8 Окт. 10, 2008 09:14:56

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

pyuser
функция filter тоже не меняет исходный список smile
хмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …



Офлайн

#9 Окт. 10, 2008 09:22:55

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

ice
pyuser
функция filter тоже не меняет исходный список smile
хмм .. тоесть в какой-то момент времени у меня будет 2 списка? это не хорошо. тут вот сейчас директорию resources открыл, так там около 2000 поддиректорий/файлов. хотя не так и много … вроде бы …
тогда цикл :(
идем по списку от конца к началу и удаляем ненужные элементы



Офлайн

#10 Окт. 10, 2008 09:46:31

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Лист с объектами и удаление по признаку.

Вот, что получилось.
но ветку с 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 отломали? не могу никак сделать



Отредактировано (Окт. 10, 2008 09:53:56)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version