如何从values_list到列表

问题描述:

的字典我有一个Django的查询集返回值的列表:如何从values_list到列表

[(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。我已经能够使用以获取客户端或任务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迭代,而不是将它们添加到一个名单。因此,这对于获取最近的值是很好的,如果值列表是将最早的记录排序到最新值,但不是为了为字典值创建列表的列表。

相反的target_dict=dict(zip(keys,values)),做

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

defaultdict是标准模块collections可用。)

from collections import defaultdict 
d = defaultdict(list) 
for x in vls_list: 
    d[x].append(list(x[1:])) 

虽然我不知道如果我得到了问题的权利。

我知道在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 

为了更好的速度,我建议你不要创建键和值分别列出,但简单地只用一个循环:

tgt_dict = defaultdict(list) 
for row in vas_list: 
    tgt_dict[row[0]].append([row[1], row[2]]) 
+0

因此,如果values_list传递给此方法vls_list,请问这是怎么看的DEF声明。我想我没有看到行[0]是如何工作的,以获得列表中每个列表的第一个值。 – 2012-03-13 23:51:54

+0

你有一个元组'vls_list'的列表(对不起,这是'vas_list'的一个错字),当你为'vls_list:'中的行进行操作时,它实际上是通过元组迭代vls_list元组的,所以row [0]将是'client PK”。如果我的理解正确,你想使用'客户端PK'作为关键。但是,通过使用正确的索引,您可以使用元组中的任何项作为关键字。 – user866903 2012-03-14 00:21:42

+0

好的,谢谢。看起来像另一条路线来做到这一点。 – 2012-03-14 00:55:24