【问题标题】:Merge dictionaries from a loop从循环中合并字典
【发布时间】:2021-02-27 03:26:18
【问题描述】:

我有使用循环创建的字典:

for (obj1, obj2), df in df2.groupby(['a', 'b']):
    obj_dict = (df
                .query('a == @obj1')
                .query('b == @obj2')
                .set_index('b')['c']
                .to_dict()
               )
    print(obj_dict)

这是结果:

{'2': '3'}
{'5': '6'}
{'8': '9'}

我想将这些字典合并成一个如下所示的字典:

{'2': '3','5': '6','8': '9'}

我已尝试按照建议的here 使用.update,但这似乎不起作用:

for (obj1, obj2), df in df2.groupby(['a', 'b']):
    obj_dict = (df
                .query('a == @obj1')
                .query('b == @obj2')
                .set_index('b')['c']
                .to_dict()
               )
    print(obj_dict)
    result = {}
    for d in obj_dict:
        print(d)
        result.update(d)

结果:

{'2': '3'}
2
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-107-ca40733d19d7> in <module>
     10     for d in obj_dict:
     11         print(d)
---> 12         result.update(d)

ValueError: dictionary update sequence element #0 has length 1; 2 is required

我真的不明白为什么结果中的d 只是键而不是实际的字典。

【问题讨论】:

  • 如果你遍历一个字典,你会得到一个遍历它的键的迭代器。如果你想要键和值,那么迭代 dict.items()。

标签: python list dictionary merge


【解决方案1】:

看起来你的事情有点不对劲。试试这个:

result = {}
for (obj1, obj2), df in df2.groupby(['a', 'b']):
    obj_dict = (df
                .query('a == @obj1')
                .query('b == @obj2')
                .set_index('b')['c']
                .to_dict()
               )
    print(obj_dict)
    result.update(obj_dict)

【讨论】:

    【解决方案2】:

    d 是关键,因为您正在迭代字典本身,而不是字典列表。 python 功能(不是错误)。我会稍微修改一下代码。

    我们定义了一个新的obj_dict,它将包含所有合并的数据。然后我们用从数据帧创建的new_dict 更新它。

    obj_dict = {}
    for (obj1, obj2), df in df2.groupby(['a', 'b']):
        new_dict = (df
                    .query('a == @obj1')
                    .query('b == @obj2')
                    .set_index('b')['c']
                    .to_dict()
                   )
        obj_dict.update(new_dict)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2014-10-28
      • 2021-02-10
      • 2018-08-18
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多