【问题标题】:How to compare two nested dictionaries with the same keys and update values with a condition in python?如何比较具有相同键的两个嵌套字典并使用python中的条件更新值?
【发布时间】:2021-01-13 01:52:53
【问题描述】:
d1 = {'Berlin': {'Boston' : 9, 'LA' : 7, 'Chicago' : 1},
      'Vienna': {'Boston' : 5, 'LA' : 2, 'Chicago' : 8}, 
      'London': {'Boston' : 8, 'LA' : 6, 'Chicago' : 5}}

d2 = {'Berlin': {'Boston' : 8, 'LA' : 9, 'Chicago' : 4},
      'Vienna': {'Boston' : 3, 'LA' : 1, 'Chicago' : 5}, 
      'London': {'Boston' : 5, 'LA' : 8, 'Chicago' : 8}}

如果 d2 中的值小于 d1 中的值,我想更新 d1 中的值以获取新字典 d:

d = {'Berlin': {'Boston' : 8, 'LA' : 7, 'Chicago' : 1},
     'Vienna': {'Boston' : 3, 'LA' : 1, 'Chicago' : 5}, 
     'London': {'Boston' : 5, 'LA' : 6, 'Chicago' : 5}}

【问题讨论】:

  • 请向我们展示您最近尝试的代码以及您遇到的问题。另请参阅:How to Askhelp center
  • 你需要在这里展示一些基本的努力;总的来说,我们是来帮助解决问题的,我们不是代码编写服务。尝试实施它,如果您的尝试以某种方式失败,请返回minimal reproducible example。提示:您需要一个嵌套循环和 min 函数(或者只是一个 if 检查较小的值,如果是则替换)。

标签: python dictionary


【解决方案1】:

这可以根据您的要求工作(通过zip 将它们迭代在一起,并重新组合为dict,将其作为值与相同的k 再次作为键) :

d1 = {'Berlin': {'Boston' : 9, 'LA' : 7, 'Chicago' : 1},
      'Vienna': {'Boston' : 5, 'LA' : 2, 'Chicago' : 8}, 
      'London': {'Boston' : 8, 'LA' : 6, 'Chicago' : 5}}

d2 = {'Berlin': {'Boston' : 8, 'LA' : 9, 'Chicago' : 4},
      'Vienna': {'Boston' : 3, 'LA' : 1, 'Chicago' : 5}, 
      'London': {'Boston' : 5, 'LA' : 8, 'Chicago' : 8}}

>>> {k: dict([min(i, j) for i, j in zip(d1[k].items(), d2[k].items())]) for k in d1.keys()}
{'Berlin': {'Boston': 8, 'LA': 7, 'Chicago': 1},
 'Vienna': {'Boston': 3, 'LA': 1, 'Chicago': 5},
 'London': {'Boston': 5, 'LA': 6, 'Chicago': 5}}

【讨论】:

  • 您可以仅对值进行最小化,而不是对项目进行最小化。另外,它允许您使用更容易阅读和更短的 dict comp 语法。 {k: {k1: min(d1[k][k1], d2[k][k1]) for k1 in d1[k]} for k in d1}
【解决方案2】:

这些数据似乎作为dataframe(基本上是一个表格)而不是嵌套字典会更好。

创建输入数据框后,您只需使用为每个单元格选择最小值的函数将它们组合起来。这是直接来自 the documentation 的一种方法:

import numpy as np
import pandas as pd

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

df_new = df1.combine(df2, np.minimum)
print(df_new)

输出:

         Berlin  Vienna  London
Boston        8       3       5
LA            7       1       6
Chicago       1       5       5

如果您需要将其恢复为 dict,可以使用 DataFrame.to_dict():

d = df_new.to_dict()

变成:

{'Berlin': {'Boston': 8, 'LA': 7, 'Chicago': 1},
 'Vienna': {'Boston': 3, 'LA': 1, 'Chicago': 5},
 'London': {'Boston': 5, 'LA': 6, 'Chicago': 5}}

附:我不是 Pandas 的专家

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 2022-01-18
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多