首页 > 解决方案 > 如何根据值更新字典键?

问题描述

我有两个具有相似值但键不同的字典。我想db用第一个字典的键值更新第二个字典user

在不使逻辑过于复杂的情况下,最佳方法是什么?

例如,我有以下字典:

user = {'school': ['books', 'pencils', 'sheets', 'notebooks']}
db = {'education': ['books', 'pencils', 'sheets', 'notebooks'],
      'actors': ['student', 'teacher', 'principal']}

user['school']db['education']具有相同的列表值。我只想dbuser. 我认为实现的方式如下:

def get_key(my_dict, val):
    for key, value in my_dict.items():
        if val == value: 
            return key 
    return None

res = {}
for key, value in db.items():
    if value in user.values():
        key_user = get_key(user, value)
        if key_user:            
            res.update({key_user: value})
    else:
        res.update({key: value})

print(res)

我在 Python 3.6.6 中实现了这一点,所以据我所知,字典条目的顺序是保留的。

所需的输出如下:

{'school': ['books', 'pencils', 'sheets', 'notebooks'],
 'actors': ['student', 'teacher', 'principal']}

标签: pythonpython-3.xdictionaryordereddictionary

解决方案


正如您所说的顺序很重要,我认为最简单的方法是重新创建字典,但对于较大的数据集不是很有效。

我们可以迭代db重新创建它,我们唯一需要查看的是是否使用来自user或的键db。如果密钥存在于内部,user_values那么我们可以获取它的索引并使用它来获取密钥user_keys,否则我们使用key.

user = {'school': ['books', 'pencils', 'sheets', 'notebooks']}
db = {'education': ['books', 'pencils','sheets','notebooks'],
      'actors': ['student','teacher','principal']}

user_keys = tuple(user.keys())
user_values = tuple(user.values())

new_db = {user_keys[user_values.index(value)] if value in user_values else key: value for key, value in db.items()}

>>> {'school': ['books', 'pencils', 'sheets', 'notebooks'],
     'actors': ['student', 'teacher', 'principal']}

推荐阅读