Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2010 00:04:52

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

Что б каждый элемент был не ссылочной копией а уникальным местом в памяти.
т.е. что-то типа того:

c=[[]for k in range(9)]
так делается вообще?



Офлайн

#2 Май 14, 2010 01:20:25

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

c = list(list() for k in range(9))
ток зачем, столько пустых списков?)



Офлайн

#3 Май 14, 2010 07:38:30

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

Evg
c = list(list() for k in range(9))
ток зачем, столько пустых списков?)
ага, спасибо. Ну списки пустые делаются что б их потом заполнить. А вообще мне надо для инициализации словарика, в котором будет расти дерево, даже не совсем дерево, скорей ветвистый ствол графа.



Офлайн

#4 Май 14, 2010 11:19:53

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

Как инициализировать список списков?

alexx11
А вообще мне надо для инициализации словарика, в котором будет расти дерево
Может это подойдет http://docs.python.org/library/collections.html#collections.defaultdict ?
Вот пример:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['test0'].append(0)
>> d['test1'].append(1)
>>> print d['test0'], d['test1']
[0] [1]



Отредактировано (Май 14, 2010 11:21:01)

Офлайн

#5 Май 14, 2010 12:03:00

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

Ed
Может это подойдет http://docs.python.org/library/collections.html#collections.defaultdict ?
Спасибо за ссылку, сравнил - функциональность полностью устраивает, но возник вопрос что же выбрать?
1 вариант:
keys = ["aa", "bb", "cc"]
d = dict(zip(keys, [[]for k in range(len(keys))]))
for k in keys:
d[k].append("value: " + k)
2 вариант:
from collections import defaultdict
keys = ["aa", "bb", "cc"]
d = defaultdict(list)
for k in keys:
d[k].append("value: " + k)



Офлайн

#6 Май 14, 2010 12:09:52

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как инициализировать список списков?

Мой извращенский вариант:

>>> l = map(apply, [list] * 9) 
>>> l
[[], [], [], [], [], [], [], [], []]
>>> l[0] += ['foo']
>>> l[-1] += ['bar']
>>> l
[['foo'], [], [], [], [], [], [], [], ['bar']]
Если требуется какое-то большее число списков, стоит посмотреть в сторону itertools.repeat.

p.s. collections.defaultdict конечно симпатичнее.

..bw



Отредактировано (Май 14, 2010 12:12:44)

Офлайн

#7 Май 14, 2010 12:25:33

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

Как инициализировать список списков?

alexx11
Спасибо за ссылку, сравнил - функциональность полностью устраивает, но возник вопрос что же выбрать?
Смотря что вам вообще нужно. Если вы опишете задачу, то возможно, что выбор будет совсем другой. Смею предположить, что задача-то у вас наверняка не в инициализации словаря заключается.



Офлайн

#8 Май 14, 2010 12:55:36

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

Ed
что задача-то у вас наверняка не в инициализации словаря заключается.
Как я уже говорил в словарике граф (тыч 10 вершин), причём достаточно связанный, т.е. критично время доступа к словарю. Тесты показали первый вариант выигрывает в разы именно в скорости доступа, но что парадоксально сам код инициализации d = dict(zip(keys, [for k in range(len(keys))])), работает медленней чем весь второй вариант проверил на списке размером 10^6.
bw
Мой извращенский вариант:
Вариант 3
keys = ["aa", "bb", "cc"]
d = dict(zip(keys, map(apply, [list]*len(keys))))
for k in keys:
d[k].append("value: " + k)
Однако, по скорости доступа от первого не отличается, а в инициализации мне показался быстрей, но или почти одинаково.



Офлайн

#9 Май 14, 2010 13:07:14

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Как инициализировать список списков?

>>> l = map(apply, [list] * 9) 
>>> l
[[], [], [], [], [], [], [], [], []]
О_о'
а чем так не нравится? [] * 9



Офлайн

#10 Май 14, 2010 13:18:54

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

Как инициализировать список списков?

Для работы с графами я бы попользовал уже существующие библиотеки, коих вагон. На это и намекал, говоря о задаче.

Естественно голый dict по скорости доступа не обогнать, defaultdict - это его потомок, отсюда и дополнительные накладные расходы. Но он приносит с собой ленивость, которая в некоторых случаях является существенным плюсом.

По поводу скорости заполнения могут быть варианты. Опять таки зависит от задачи. Может начальное заполнение вообще не нужно. Если бы вы показали ваши тесты с данными, приближенными к реальности, то можно было бы поиграть и подумать.
Я сильно надеюсь, что в реальности вы не инициализируете ваш словарь значениями “value: ” + k. На одном этом можно угробить всю производительность - сложение строк в Питоне далеко не самая быстрая операция.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version