以分层形式对Python词典进行分组

时间:2012-03-20 17:21:09

标签: 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'}]
...
]

现在如果我想使用多个键分组'dept'和'age',上面提到的方法会返回

[{(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'}]}]

所需的输出是:

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

可以用itertools完成吗?或者我是否需要自己编写代码? 感谢。

3 个答案:

答案 0 :(得分:3)

绝对。您只需要先将itertools.groupby()应用于第二个标准,然后再应用另一个标准。

答案 1 :(得分:2)

您需要编写一个(可能是递归的)代码来自己执行此操作 - itertools中没有树构建器。

答案 2 :(得分: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)