从字典中过滤嵌套数据

我有这本词典:


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}

}

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


shorted_dict = OrderedDict(sorted(list.items(), key=lambda x: (operator.getitem(x[1], 'role'), operator.getitem(x[1], 'perm'))))

但这并不完全是我想要的。


青春有我
浏览 62回答 2
2回答

aluckdog

也许尝试一个功能? 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该函数返回, filter_dict(1,5,my_dict) {'user_1': {'role': 1, 'perm': 5}, 'user_2': {'role': 1, 'perm': 5}}

函数式编程

当你建立索引时,你有点想把整个事情翻个底朝天。然后你可以使用索引来构造你想要的字典:import jsondata = {        '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 indexindex = {}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 dictionariesrepeated_role_perm = {}only_role_repeated = {}leftovers = {}# Walk our index, putting each leaf into the right target dictionaryfor 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 resultsprint('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))结果: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    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python