过滤字典中的嵌套数据

时间:2020-10-01 01:39:27

标签: python

我有这本字典:

package.json

我该如何过滤以仅通过以下方式拾取按键:

重复的角色和权限:

dict = {
        'user_1': {'role': 1, 'perm': 5},
        'user_2': {'role': 1, 'perm': 5},
        'user_3': {'role': 1, 'perm': 4},
        'user_4': {'role': 1, 'perm': 7},
        'user_5': {'role': 3, 'perm': 5}
    }

角色重复但没有重复权限:

repeated_role_perm = {
        'user_1': {'role': 1, 'perm': 5},
        'user_2': {'role': 1, 'perm': 5},
    }

剩菜:

only_role_repeated = {
      'user_3': {'role': 1, 'perm': 4},
      'user_4': {'role': 1, 'perm': 7},
}

我能够使用以下代码来缩短数据:

leftovers = {
 'user_5': {'role': 3, 'perm': 5}
}

但这不是我想要的。

2 个答案:

答案 0 :(得分:0)

您有点想在构建索引时将整个内容完全翻过来。然后,您可以使用索引来构建所需的词典:

y=lambda x, ...

结果:

import json

data = {
        'user_1': {'role': 1, 'perm': 5},
        'user_2': {'role': 1, 'perm': 5},
        'user_3': {'role': 1, 'perm': 4},
        'user_4': {'role': 1, 'perm': 7},
        'user_5': {'role': 3, 'perm': 5}
    }

# Build an index
index = {}
for (user, v) in data.items():
    role = v['role']
    perm = v['perm']
    if role not in index:
        index[role] = {}
    if perm not in index[role]:
        index[role][perm] = []
    index[role][perm].append({user:v})

# Dump the index
# print(json.dumps(index, indent=4))

# Define our target dictionaries
repeated_role_perm = {}
only_role_repeated = {}
leftovers = {}

# Walk our index, putting each leaf into the right target dictionary
for role in index:
    perms = index[role]
    target = leftovers
    for perm in perms:
        users = index[role][perm]
        if len(perms) > 1:
            if len(users) > 1:
                target = repeated_role_perm
            else:
                target = only_role_repeated
        for userdict in users:
            target.update(userdict)

# Print the results
print('repeated_role_perm = ' + json.dumps(repeated_role_perm, indent=4))
print()
print('only_role_repeated = ' + json.dumps(only_role_repeated, indent=4))
print()
print('leftovers = ' + json.dumps(leftovers, indent=4))

答案 1 :(得分:0)

也许尝试一个功能?

{{onModel.username}} // nothing - Note, twitter schema and local schema both have username

此函数返回,

 my_dict = {
    'user_1': {'role': 1, 'perm': 5},
    'user_2': {'role': 1, 'perm': 5},
    'user_3': {'role': 1, 'perm': 4},
    'user_4': {'role': 1, 'perm': 7},
    'user_5': {'role': 3, 'perm': 5}
}

 def filter_dict(role,perm,dic):
      filtered = {}
      users = [k for k in dic.keys() if dic[k]['role'] == int(role) and 
      dic[k]['perm'] == int(perm)]
      for user in users:
           filtered[user] = dic[user]
 return filtered