如何从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]])
因此,如果values_list传递给此方法vls_list,请问这是怎么看的DEF声明。我想我没有看到行[0]是如何工作的,以获得列表中每个列表的第一个值。 – 2012-03-13 23:51:54
你有一个元组'vls_list'的列表(对不起,这是'vas_list'的一个错字),当你为'vls_list:'中的行进行操作时,它实际上是通过元组迭代vls_list元组的,所以row [0]将是'client PK”。如果我的理解正确,你想使用'客户端PK'作为关键。但是,通过使用正确的索引,您可以使用元组中的任何项作为关键字。 – user866903 2012-03-14 00:21:42
好的,谢谢。看起来像另一条路线来做到这一点。 – 2012-03-14 00:55:24