Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как транспонировать QuerySet или превратить список (массив) словарей в словарь списков (массивов)?

Собственно в вопросе все сказано. Делается большой-мудреный raw-запрос. Получаем QuerySet, но нужно нужно вывести его не по-строчно, а по стобцам... Например:
qSetKit = SetKit.objects.raw("SELECT ... ... ...")
listSetKit = list(qSetKit)
print listSetKit

Выдает, допустим вот такой список словарей:
[
    { "Aaa": 1, "Bbb": 100, "Ccc": 22, "Ddd": u"red"},
    { "Aaa": 10, "Bbb": 101, "Ccc": 0, "Ddd": u"pink"},
    { "Aaa": 0, "Bbb": 6, "Ccc": 0, "Ddd": u"snowwhite"}
]


А нужно получить словарь списков:
{ 
   "Aaa": [1, 10, 0],
   "Bbb": [100, 101, 6],
   "Ccc": [22, 0, 0],
   "Ddd": [u"red", u"pink", u"snowwhite"]
}

Понятно, что можно все это сделать в цикле (тем более, что для одних результирующих списков в словаре в моем случае надо найти всякие среднегометрические, для других отклонение, для третьих что-то еще)... Но из спортивного интереса хочется знать универсальное решение. Списков в словаре, с которыми надо будет что-то делать дополнительно, не много. Всего 15-20%. Остальные без изменения перекидываются в шаблон. А вот самих ключей у результирующего словаря -- очень дофига! Их циклом гонять из массива списков в список массива -- не рационально и ресурсоемко. Хочется этого избежать.
  • Вопрос задан
  • 751 просмотр
Пригласить эксперта
Ответы на вопрос 1
@r1ch
ДЕМО ЗДЕСЬ

def pluck(coll):
    coll_keys = {}
    
    for i in coll:
        coll_keys.update(i)
    
    new_coll = {}
    
    for i in coll_keys.keys():
        new_coll[i] = []
        
    for i in coll:    
        for j in new_coll:
            if j in i:
                new_coll[j].append(i[j])

    return new_coll

print pluck([
    {'Aaa': 1, 'Bbb': 100, 'Ccc': 22, 'Ddd': u'red'},
    {'Aaa': 10, 'Bbb': 101, 'Ccc': 0, 'Ddd': u'pink'},
    {'Aaa': 0, 'Bbb': 6, 'Ccc': 0, 'Ddd': u'snowwhite'}
])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы