2012-03-20 54 views
0

我有一个词典列表,我想对这些数据进行分组。我用下面的:按分层格式对Python词典进行分组

group_list = [] 
for key, items in itertools.groupby(res, operator.itemgetter('dept')): 
    group_list.append({key:list(items)}) 

对于像这样

[{'dept':1, 'age':10, 'name':'Sam'}, 
{'dept':1, 'age':12, 'name':'John'}, 
. 
. 
. 
{'dept':2,'age':20, 'name':'Mary'}, 
{'dept':2,'age':11, 'name':'Mark'}, 
{'dept':2,'age':11, 'name':'Tom'}] 

数据输出将是:

[{1:[{'dept':1, 'age':10, 'name':'Sam'}, 
    {'dept':1, 'age':12, 'name':'John'}], 
{2:[{'dept':2,'age':20, 'name':'Mary'}, 
    {'dept':2,'age':11, 'name':'Mark'}, 
    {'dept':2,'age':11, 'name':'Tom'}] 
... 
] 

现在,如果我使用多个密钥想组说“部门”和'年龄',上述方法返回

[{(2, 20): [{'age': 20, 'dept': 2, 'name': 'Mary'}]}, 
{(2, 11): [{'age': 11, 'dept': 2, 'name': 'Mark'}, 
      {'age': 11, 'dept': 2, 'name': 'Tom'}]}, 
{(1, 10): [{'age': 10, 'dept': 1, 'name': 'Sam'}]}, 
{(1, 12): [{'age': 12, 'dept': 1, 'name': 'John'}]}] 

期望的输出将是:

​​

可以使用itertools来完成吗?或者我需要自己写这些代码吗? 谢谢。

+0

你是否真的想要在输出中使用字典列表?列表中的每个外部字典似乎都有一个单一的密钥 - 不会有一个简单的字典(对于上面的例子,密钥=(1,2))就足够了吗? – jsbueno 2012-03-20 17:27:56

+0

我需要这个原因我正在为Django构建一个小型报表引擎。组通常会被解释为模板中的循环。我认为他们是分层的,因为每个组都会有不同的数据。 – thelinuxer 2012-03-20 17:39:47

回答

1

谢谢大家的帮助。下面是我的做法:

import itertools, operator 

l = [{'dept':1, 'age':10, 'name':'Sam'}, 
     {'dept':1, 'age':12, 'name':'John'}, 
     {'dept':2,'age':20, 'name':'Mary'}, 
     {'dept':2,'age':11, 'name':'Mark'}, 
     {'dept':2,'age':11, 'name':'Tom'}] 

groups = ['dept', 'age', 'name'] 

groups.reverse() 
def hierachical_data(data, groups): 
    g = groups[-1] 
    g_list = [] 
    for key, items in itertools.groupby(data, operator.itemgetter(g)): 
     g_list.append({key:list(items)}) 
    groups = groups[0:-1] 
    if(len(groups) != 0): 
     for e in g_list: 
      for k,v in e.items(): 
       e[k] = hierachical_data(v, groups) 

    return g_list 

print hierachical_data(l, groups) 
2

您需要编写一个代码(可能是递归的)来自己完成这个任务 - itertools在其中没有树生成器。

3

绝对如此。你只需要为第二个标准先应用itertools.groupby(),然后再应用另一个。

+1

这涉及到一些自定义代码,恰好使用itertools。 :) – Amber 2012-03-20 17:25:30