我有这本字典:
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}
}
但这不是我想要的。
答案 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