Хочу написать небольшой скрипт на python. Язык знаю посредственно а сделать охота быстро.
Как создать многомерный массив с ключами. что-то вроде такого
А = [ 0 : [ [1,3] ,[2,4] ],
3 : [ [4,3] ,[5,4] ],
75 : [ [10,3] ,[20,4] ] ]
Для понятности - нужно в цикле забивать кортежи (кортежи ли? я не дока) в цикле по принципу имеем 3 строки из базы - ид, значение, время и должны получить удобоваримый массив чтобы можно было записать отдельно массивы с разными ид то есть
спасибо огромное. только поправьте ответ.
у меня так получилось
a = dict()
id = [1,2,3,1,1]
val = [1,3,4,5,5]
time = [5,6,7,6,5]
for i in range(len(id)):
try:
a[id[i]].append((val[i], time[i]))
except KeyError:
a[id[i]] = [(val[i], time[i])]
print(a)
{1: [(1, 5), (5, 6), (5, 5)], 2: [(3, 6)], 3: [(4, 7)]}
Я бы только в кортежи загонял, если заранее известна длинна. А там бы распаковку делал. Кортежи куда быстрее, а распаковка - почти бесплатная операция.
xSkyFoXx
Не совсем понял что вы имеете ввиду. (val, time) -- итак кортеж. Для [(v1, t1), (v2, t2), ..., (vn, tn)] заранее не известна длина.
Остается только:
id = [1,2,3,1,1] => id = (1,2,3,1,1)
val = [1,3,4,5,5] => val = (1,3,4,5,5)
time = [5,6,7,6,5] => time = (5,6,7,6,5)
Это целиком зависит от того откуда берутся данные. На практике скорее всего они с базы должны браться или файлика какого то.
Хорошим тоном в таком случае использовать defaultdict.
Из документации:
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
print d.items()
Кирилл
Да вы правы, так лучше. В принципе подозревал, что должен существовать такой dict, чтобы не плодить костыли, но сам с такими задачами особо не сталкивался. des1roer
Полагаю имелось ввиду, что так правильнее:
from collections import defaultdict
a = defaultdict(list)
id = [1, 2, 3, 1, 1]
val = [1, 3, 4, 5, 5]
time = [5, 6, 7, 6, 5]
for i in range(len(id)):
a[id[i]].append((val[i], time[i]))
for k in a.keys():
print(k, a[k])