如何在python中将嵌套字典合并到列表中?

2024-06-16 11:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

例如如果我有结果

[{'Germany': {"Luge - Men's Singles": 'Gold'}}, 
{'Germany': {"Luge - Men's Singles": 'Silver'}},
{'Italy': {"Luge - Men's Singles": 'Bronze'}}]
[{'Germany': {"Luge - Women's Singles": 'Gold'}},
{'Austria': {"Luge - Women's Singles": 'Silver'}},
{'Germany': {"Luge - Women's Singles": 'Bronze'}}]
[{'Austria': {'Luge - Doubles': 'Gold'}}, 
{'Latvia': {'Luge - Doubles': 'Silver'}},
{'Germany': {'Luge - Doubles': 'Bronze'}}]

我该如何分类,使德国等国赢得的所有比赛都能在一个标题下进行呢。 i、 德国会是德国:雪橇-男单:金,银,雪橇-女单:金,铜,雪橇-双打:铜牌。在

谢谢你的帮助

编辑:这是从python shell直接复制和粘贴,以帮助混淆:

[{'Germany':{“Luge-Men's Singles”:“Gold'}},{'Germany':{“Luge-男单”:“Silver”}},{Italy':{“Luge-男单”:“Bronze”}] [{Germany':{“Luge-女单”:“Gold'}},{Austria':{“Luge-女单”:“Silver”}},{Germany':{“Luge-女单”:“Bronze'}] [{Austria':{'Luge-Doubles':'Gold'}},{拉脱维亚':{'Luge-Doubles':'Silver'}},{德国:{'Luge-Doubles':'brown'}}]

很抱歉我是新来的。它循环3次,每个不同的事件循环一次,我想知道在最后一次循环之后,我是否可以从合并中得到所需的结果?在


Tags: silverdoublesgoldmengermanywomenitalyaustria
2条回答

(抱歉,我的本意是评论亚历克斯·马尔泰利的答案,因为我的答案是基于他的;但当我最初发帖时,我没有足够的声誉来评论)

亚历克斯的回答实际上并没有产生预期的结果。我不是说有一个dicts列表的更好的地方,或者列表之间没有逗号(稍后将详细介绍)。但最初的问题是,结果是,按国家、通过比赛收集所有奖牌。亚历克斯的解决方案将回答:

> 'Germany': [{"Luge - Men's Singles": 'Gold'},
             {"Luge - Men's Singles": 'Silver'},
             {"Luge - Women's Singles": 'Gold'},
             {"Luge - Women's Singles": 'Bronze'},
             {'Luge - Doubles': 'Bronze'}]

但我相信最初的问题是:

^{pr2}$

问题中的数据有点令人困惑,我认为有两种可能:

1)显示的数据实际上是三个不同的示例,任务是分别合并每个列表中的dict条目。也就是说,给定

[{'Germany': {"Luge - Men's Singles": 'Gold'}}, 
{'Germany': {"Luge - Men's Singles": 'Silver'}},
{'Italy': {"Luge - Men's Singles": 'Bronze'}}]

你想要吗

['Germany': {"Luge - Men's Singles": ['Gold', 'Silver'],
             "Luge - Women's Singles": ['Gold', 'Bronze']},
 'Italy': {"Luge - Men's Singles": ['Bronze']}]

,给定

[{'Germany': {"Luge - Women's Singles": 'Gold'}},
{'Austria': {"Luge - Women's Singles": 'Silver'}},
{'Germany': {"Luge - Women's Singles": 'Bronze'}}]

你想要吗

['Germany': {"Luge - Women's Singles": ['Gold', 'Bronze']},
 'Austria': {"Luge - Women's Singles": ['Silver']}]

等等。我想这是对这个问题最有可能的解释。在

以下代码可以做到这一点:

from collections import defaultdict

merged = defaultdict(lambda: defaultdict(list))
for d in list_of_dicts:
    for k in d:
        for competition, medal in d[k].iteritems():
            merged[k][competition].append(medal)

对上面显示的第一个列表运行此命令,您将得到

defaultdict(<function <lambda> at 0x1907db0>,
 {'Italy': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Bronze']}),
  'Germany': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Gold', 'Silver']})})

2)第二种可能性是问题中的数据是一个单独的列表,包含3个列表,每个列表都包含dicts。我想这不是最初的问题的意思,但是,既然我已经为此编写了代码,那么这里就是:)

from collections import defaultdict

merged = defaultdict(lambda: defaultdict(list))
for L in listoflistsofdicts:
  for d in L:
    for k in d:
      for competition, medal in d[k].iteritems():
          merged[k][competition].append(medal)

对问题上显示的列表运行上面的代码(加上必要的逗号,您将得到:

 defaultdict(<function <lambda> at 0x1904b70>,
    {'Italy': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Bronze']}),
     'Austria': defaultdict(<type 'list'>, {'Luge - Doubles': ['Gold'],
                                            "Luge - Women's Singles": ['Silver']}),
     'Latvia': defaultdict(<type 'list'>, {'Luge - Doubles': ['Silver']}),
     'Germany': defaultdict(<type 'list'>, {'Luge - Doubles': ['Bronze'],
                                            "Luge - Men's Singles": ['Gold', 'Silver'],
                                            "Luge - Women's Singles": ['Gold', 'Bronze']})
    })

请注意,这两种代码都不会对奖牌类型进行分类(例如,您可能会得到['Gold'、'Silver']或['Silver'、'Gold'])。在

当然,如果您得到了解决方案1)中使用的单独列表,但需要将所有列表合并,只需将它们全部合并到一个列表中,然后使用解决方案2)。在

import collections

merged_result = collections.defaultdict(list)

for L in listoflistsofdicts:
  for d in L:
    for k in d:
      merged_result[k].append(d[k])

或者如果你只是有一个dict列表而不是一个dict列表(很难说从你的Q!-),然后

^{pr2}$

循环的一部分。在

如果您希望字符串而不是列表作为merged_result的值,那么在上面的代码之后添加

for k in merged_result:
    merged_result[k] = ', '.join(merged_result[k])

或者,等效地(但是构建一个新的普通dict而不是defaultdict):

merged_result = dict((k, ', '.join(v)) for k, v in merged_result.iteritems())

(这假设Python2.*在Python3中,使用.items而不是{})。在

编辑:查看示例代码,对于dict列表(缺少逗号)来说,它似乎是无效的语法,所以我也演示了如何处理它。在

相关问题 更多 >