Python字典按字段分组

Python字典按字段分组,python,dictionary,grouping,Python,Dictionary,Grouping,我有这样一个字典,每个用户或每个组具有不同的权限: "permissions": [ { "user": 4, "type": "admin" }, { "user": 3, "type": "read" }, {

我有这样一个字典,每个用户或每个组具有不同的权限:

"permissions": [
            {
                "user": 4, 
                "type": "admin"
            }, 
            {
                "user": 3, 
                "type": "read"
            }, 
            {
                "group": 3, 
                "type": "admin"
            }
        ]
按权限类型获取分组的最有效方法是什么:

permissions_bytype={}
for permission_entry in permissions: #iterating over something like: [{'user': 1, 'type': u'read'}, {'user': 4, 'type': u'admin'}, {'user': 4, 'type': u'read'}]
    if permission_entry["type"] not in permissions_bytype:
        permissions_bytype[permission_entry["type"]] = {}
    for key,val in permission_entry.iteritems():
        if key <> "type": #is user or group
            if key not in permissions_bytype[permission_entry["type"]]:
                permissions_bytype[permission_entry["type"]][key] = []
            permissions_bytype[permission_entry["type"]][key].append({"id":val})
这些数字表示对象(用户/组)的id,因此我还必须在结果中稍微“转换”它们:

"permissions": [
            {
                "type": "admin",
                "users":[
                 {"id":4}
                ],
                "groups":[
                 {"id":3}
                ]
            },
            {
                "type": "read",
                "users":[
                 {"id":3}
                ]
            },
]
result=[]
for perm_type,permission_value in permissions_bytype.iteritems():
        permission_value["type"] = perm_type
        result.append(permission_value)

谢谢你的帮助

为了回答我自己的问题,我找到了以下解决方案:

我的代码并不聪明,只是简单的迭代。在第一次运行中,我创建了一个中介字典,按权限类型分组:

permissions_bytype={}
for permission_entry in permissions: #iterating over something like: [{'user': 1, 'type': u'read'}, {'user': 4, 'type': u'admin'}, {'user': 4, 'type': u'read'}]
    if permission_entry["type"] not in permissions_bytype:
        permissions_bytype[permission_entry["type"]] = {}
    for key,val in permission_entry.iteritems():
        if key <> "type": #is user or group
            if key not in permissions_bytype[permission_entry["type"]]:
                permissions_bytype[permission_entry["type"]][key] = []
            permissions_bytype[permission_entry["type"]][key].append({"id":val})

您当前执行此操作的代码是什么?您注意到一个特殊的性能问题了吗?@jonrsharpe:我正在通过序列化多个模型使用Django Rest Framework获取此数据:用户和组权限从不同的db表中获取,并聚合在“权限”字段中。@StackedUser这两个问题都没有回答。@jonrsharpe抱歉,我误解了问题。我是python新手。我目前还没有这方面的代码,我正在寻找正确的方向,使用maybe。我试图避免使用for的经典方法,并且希望利用python的强大功能。thanks@StackedUser这不是一个代码编写服务,您应该做更多的努力,并尝试自己实现一些东西。如果您不受当前结构的约束,我建议
permissions={'admin':{'users':[3],'groups':[3]},…}
会使这更容易。