python:基于单独的dict覆盖单个dict键

时间:2017-04-17 22:54:10

标签: python dictionary

我确定这样的问题存在于此处,但我似乎无法找到它。我有以下字典query

query = {'day': 0, 'item': 'Chipotle'}

一个映射字典:

day_mapping = {0:2, 1:3, 2:4, 3:5, 4:6, 5:7, 6:1}

我需要覆盖query以根据映射生成以下字典:

query = {'day': 2, 'item': 'Chipotle'}

注意query可能包含也可能不包含密钥day,因此以下内容不会返回错误:

query = {'item': 'Chipotle'}

到目前为止,我已经提出了这个问题,但是使用列表理解还是一个更好的方法:

for k, v in query.items():
    if k == 'day':
        query[k] = day_mapping[v]

这样做的原因是对于python的calendar库和MongoDB的aggregation框架,天数的数字表示是不同的。有点烦人,但我确定这种情况发生在各处。

2 个答案:

答案 0 :(得分:3)

只需try即可替换它。这避免了一次不必要的散列(与使用if 'day' in query:相比)或循环遍历字典并遵循Pythons EAFP principle

try:
    query['day'] = day_mapping[query['day']]
except KeyError:
    pass

答案 1 :(得分:0)

您可以使用dict.get(..)检查'day'中是否存在dict密钥:

query = {'day': 0, 'item': 'Chipotle'}
day_mapping = {0:2, 1:3, 2:4, 3:5, 4:6, 5:7, 6:1}

day = query.get('day')  # returns `None` if 'day' key not found in `dict`
if day is not None:
    query['day'] = day_mapping[day]

以上示例中query dict的更新值将为:

{'day': 2, 'item': 'Chipotle'}