Найти - Пользователи
Полная версия: Как инициализировать список списков?
Начало » Python для новичков » Как инициализировать список списков?
1 2
alexx11
Что б каждый элемент был не ссылочной копией а уникальным местом в памяти.
т.е. что-то типа того:
c=[[]for k in range(9)]
так делается вообще?
Evg
c = list(list() for k in range(9))
ток зачем, столько пустых списков?)
alexx11
Evg
c = list(list() for k in range(9))
ток зачем, столько пустых списков?)
ага, спасибо. Ну списки пустые делаются что б их потом заполнить. А вообще мне надо для инициализации словарика, в котором будет расти дерево, даже не совсем дерево, скорей ветвистый ствол графа.
Ed
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]
alexx11
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)
bw
Мой извращенский вариант:
>>> l = map(apply, [list] * 9) 
>>> l
[[], [], [], [], [], [], [], [], []]
>>> l[0] += ['foo']
>>> l[-1] += ['bar']
>>> l
[['foo'], [], [], [], [], [], [], [], ['bar']]
Если требуется какое-то большее число списков, стоит посмотреть в сторону itertools.repeat.

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

..bw
Ed
alexx11
Спасибо за ссылку, сравнил - функциональность полностью устраивает, но возник вопрос что же выбрать?
Смотря что вам вообще нужно. Если вы опишете задачу, то возможно, что выбор будет совсем другой. Смею предположить, что задача-то у вас наверняка не в инициализации словаря заключается.
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)
Однако, по скорости доступа от первого не отличается, а в инициализации мне показался быстрей, но или почти одинаково.
Zubchick
>>> l = map(apply, [list] * 9) 
>>> l
[[], [], [], [], [], [], [], [], []]
О_о'
а чем так не нравится? [] * 9
Ed
Для работы с графами я бы попользовал уже существующие библиотеки, коих вагон. На это и намекал, говоря о задаче.

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

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