Форум сайта python.su
Что б каждый элемент был не ссылочной копией а уникальным местом в памяти.
т.е. что-то типа того:
c=[[]for k in range(9)]
Офлайн
c = list(list() for k in range(9))
ток зачем, столько пустых списков?)
Офлайн
Evgага, спасибо. Ну списки пустые делаются что б их потом заполнить. А вообще мне надо для инициализации словарика, в котором будет расти дерево, даже не совсем дерево, скорей ветвистый ствол графа.
c = list(list() for k in range(9))
ток зачем, столько пустых списков?)
Офлайн
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)
Офлайн
EdСпасибо за ссылку, сравнил - функциональность полностью устраивает, но возник вопрос что же выбрать?
Может это подойдет http://docs.python.org/library/collections.html#collections.defaultdict ?
keys = ["aa", "bb", "cc"]
d = dict(zip(keys, [[]for k in range(len(keys))]))
for k in keys:
d[k].append("value: " + k)
from collections import defaultdict
keys = ["aa", "bb", "cc"]
d = defaultdict(list)
for k in keys:
d[k].append("value: " + k)
Офлайн
Мой извращенский вариант:
>>> l = map(apply, [list] * 9)
>>> l
[[], [], [], [], [], [], [], [], []]
>>> l[0] += ['foo']
>>> l[-1] += ['bar']
>>> l
[['foo'], [], [], [], [], [], [], [], ['bar']]
Отредактировано (Май 14, 2010 12:12:44)
Офлайн
alexx11Смотря что вам вообще нужно. Если вы опишете задачу, то возможно, что выбор будет совсем другой. Смею предположить, что задача-то у вас наверняка не в инициализации словаря заключается.
Спасибо за ссылку, сравнил - функциональность полностью устраивает, но возник вопрос что же выбрать?
Офлайн
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)
Офлайн
>>> l = map(apply, [list] * 9)
>>> l
[[], [], [], [], [], [], [], [], []]
Офлайн
Для работы с графами я бы попользовал уже существующие библиотеки, коих вагон. На это и намекал, говоря о задаче.
Естественно голый dict по скорости доступа не обогнать, defaultdict - это его потомок, отсюда и дополнительные накладные расходы. Но он приносит с собой ленивость, которая в некоторых случаях является существенным плюсом.
По поводу скорости заполнения могут быть варианты. Опять таки зависит от задачи. Может начальное заполнение вообще не нужно. Если бы вы показали ваши тесты с данными, приближенными к реальности, то можно было бы поиграть и подумать.
Я сильно надеюсь, что в реальности вы не инициализируете ваш словарь значениями “value: ” + k. На одном этом можно угробить всю производительность - сложение строк в Питоне далеко не самая быстрая операция.
Офлайн