Как перейти от values_list к словарю списков - PullRequest
0 голосов
/ 14 марта 2012

У меня есть набор запросов django, который возвращает список значений:

[(client pk, timestamp, value, task pk), (client pk, timestamp, value, task pk),....,].

Я пытаюсь получить словарь этого формата:

{client pk:[[timestamp, value],[timestamp, value],...,], client pk:[list of lists],...,}

values_list может иметь несколько записей для каждого клиента pk. Мне удалось получить словари списков для клиента или задачи ПК, используя:

def dict_from_vl(vls_list):
    keys=[values_list[x][3] for x in range(0,len(values_list),1)]
    values = [[values_list[x][1], values_list[x][2]] for x in range(0,len(values_list),1)]
    target_dict=dict(zip(keys,values))
    return target_dict

Однако, используя этот метод, значения для того же ключа записываются поверх предыдущих значений при их повторении в списке values_list, а не добавляются в список. Так что это отлично подходит для получения самых последних, если список значений отсортирован по самым старым записям в новейшие, но не для создания списка списков для значения dict.

Ответы [ 4 ]

1 голос
/ 14 марта 2012

Для большей скорости я предлагаю вам не создавать списки ключей и значений отдельно, а просто использовать только один цикл:

tgt_dict = defaultdict(list)
for row in vas_list:
    tgt_dict[row[0]].append([row[1], row[2]])
1 голос
/ 14 марта 2012
from collections import defaultdict
d = defaultdict(list)
for x in vls_list:
   d[x].append(list(x[1:]))

Хотя я не уверен, правильно ли я понял вопрос.

1 голос
/ 14 марта 2012

Я знаю, что в Python вы должны втиснуть все в одну строку, но вы можете сделать это по старинке ...

def dict_from_vl(vls_list):
    target_dict = {}
    for v in vls_list:
        if v[0] not in target_dict:
            target_dict[v[0]] = []
        target_dict[v[0]].append([v[1], v[2]])
    return target_dict
1 голос
/ 14 марта 2012

Вместо target_dict=dict(zip(keys,values)), сделайте

target_dict = defaultdict(list)
for i, key in enumerate(keys):
    target_dict[k].append(values[i])

(defaultdict доступно в стандартном модуле collections.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...