1

例如,如果我有结果

[{'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'}}]

我将如何对此进行排序,以便德国等赢得的所有赛事都可以归于一个冠军头衔。即德国将是德国:无舵雪橇 - 男单:金牌、银牌、无舵雪橇 - 女单:金牌、铜牌、无舵雪橇 - 双打:铜牌。

谢谢你的帮助

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

[{'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'}}]

对不起,我是这个网站的新手。它为每个不同的事件循环 3 次,我想知道我是否可以在最后一个循环之后通过合并它来获得期望?

4

2 回答 2

4
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])

或者如果你只有一个字典列表而不是一个字典列表(很难从你的 Q 中说出来!-),那么只有

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

循环的一部分。

如果您想要字符串而不是列表作为 then 的值,merged_result则在上述代码后添加

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

或者,等效地(但构建一个新的普通字典而不是默认字典):

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

(这假设 Python 2.* - 在 Python 3 中,使用.items代替.iteritems)。

编辑:查看示例代码,它看起来像是字典列表列表的无效语法(缺少逗号),所以我也展示了如何处理它。

于 2010-04-15T15:22:10.593 回答
1

(对不起,我的意思是对 Alex Martelli 的回答的评论,因为我的答案是基于他的;但是当我最初发布时,我没有足够的声誉来发表评论)

亚历克斯的回答实际上并没有产生预期的结果。我并不是指拥有 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'}]

但我相信最初的问题实际上是要求:

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

问题中的数据有点混乱,我看到了两种可能性:

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个列表,每个列表都包含字典。我认为这不是原始问题的意思,但是,因为我已经为此编写了代码,所以这里是:)

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)。

于 2010-04-16T03:06:58.057 回答