【问题标题】:Merge dictionary with recurrence合并字典与重复
【发布时间】:2021-08-03 02:45:27
【问题描述】:

我有一个循环:

all_rec = {}
for i in range(0, 2):
     rec = buildings[best_buildings[i]]['recommendations']

第一次迭代后'rec'的值:

rec = {'a': {'b': 2, 'c': 1}, 'd': {'e': 5}}

第二次迭代后'rec'的值:

rec = {'d': {'e': 4}}

“推荐”的数据类型是字典。如何将此循环产生的所有“rec”字典添加到一个字典“all_rec”中?

我希望“all_rec”看起来像这样:

all_rec = {'a': {'b': 2, 'c': 1}, 'd': {'e': 5}, 'd': {'e': 4}}  

在新字典中同时保留 'd': {'e': 5} 和 'd': {'e': 4}。如何在 Python 2.7 中做到这一点?

【问题讨论】:

  • 你不能。 Python 中的字典必须有唯一的键。
  • 将值改为list。追加到该列表而不是覆盖。
  • collections.defaultdict 是解决方案,但我需要你的数据来编写代码!

标签: python python-2.7 dictionary


【解决方案1】:

如果您需要保留所有这些值,建议下层字典中的值应该是列表,至少对于摘要列表:

all_rec = {}
for i in range(0, 2):
     rec = buildings[best_buildings[i]]['recommendations']
     for dk, dc in rec.items():
         if dk not in all_rec:
             all_rec[dk] = {k:[v] for k,v in dc.items()}
         else:
             for k,v in dc.items():
                 if k in all_rec[dk]:
                     all_rec[dk][k].append(v)
                 else:
                     all_rec[dk][k] = [v]

print(all_rec)
{'a': {'b': [2], 'c': [1]}, 'd': {'e': [5,4]}}

这是 Python 3.7;我不知道您需要如何调整才能使用 2.7,但我尽可能保持基本。

【讨论】:

  • range 在 Python2.7 中工作 - 不同的是我 Python 2 range() 产生一个列表。
  • @TonySuffolk66 我以为只是xrange - 我的错。我没有使用过 Python 2.x,但我看到的所有代码都使用了xrange
  • xrange 在这里使用会更好 - 但在 Python 2 中范围是正确的(但效率较低)。
【解决方案2】:

我没有你的数据,但这是粗略的想法:

如果您想总结建议:

from collections import defaultdict

all_rec = defaultdict(lambda: defaultdict(int))
for i in range(0, 2):
     rec[buildings[best_buildings[i]]] += buildings[best_buildings[i]]['recommendations']

如果您想附加建议:

from collections import defaultdict

all_rec = defaultdict(lambda: defaultdict(list))
for i in range(0, 2):
     rec[buildings[best_buildings[i]]].append(buildings[best_buildings[i]]['recommendations'])

--- 演示

>>> from collections import defaultdict
>>> 
>>> demo = defaultdict(lambda: defaultdict(int))
>>> demo['a']['b'] += 1
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2700>, {'a': defaultdict(<class 'int'>, {'b': 1})})
>>> demo['a']['b'] += 1
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2700>, {'a': defaultdict(<class 'int'>, {'b': 2})})
>>> 
>>> demo = defaultdict(lambda: defaultdict(list))
>>> demo['a']['b'].append(1)
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2b80>, {'a': defaultdict(<class 'list'>, {'b': [1]})})
>>> demo['a']['b'].append(1)
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2b80>, {'a': defaultdict(<class 'list'>, {'b': [1, 1]})})
>>> 

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2012-09-12
    • 2021-11-05
    • 2011-10-17
    • 2020-05-29
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多