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

ドイツが勝ったすべてのイベントが 1 つのタイトルの下にあるようにするにはどうすればよいでしょうか。つまり、ドイツはドイツとなります。リュージュ - 男子シングルス: ゴールド、シルバー、リュージュ - 女子シングルス: ゴールド、ブロンズ、リュージュ - ダブルス: ブロンズ。

助けてくれてありがとう

編集:これは、混乱を助けるために、Pythonシェルから直接コピーして貼り付けたものです:

[{'ドイツ': {"リュージュ - 男子シングルス": 'ゴールド'}}, {'ドイツ': {"リュージュ - 男子シングルス": 'シルバー'}}, {'イタリア': {"リュージュ - 男子シングルス": 'Bronze'}}] [{'Germany': {"Luge - Women's Singles": 'Gold'}}, {'Austria': {"Luge - Women's Singles": 'Silver'}}, {'Germany ': {"リュージュ - 女子シングルス": 'ブロンズ'}}] [{'オーストリア': {'リュージュ - ダブルス': 'ゴールド'}}, {'ラトビア': {'リュージュ - ダブルス': 'シルバー' }}, {'ドイツ': {'リュージュ - ダブルス': 'ブロンズ'}}]

申し訳ありませんが、このサイトは初めてです。異なるイベントごとに 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])

ループの一部。

リストではなく文字列を値として使用する場合はmerged_result、上記のコードの後に​​追加します

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

または、同等に (ただし、defaultdict の代わりに新しいプレーンな dict を作成します):

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の回答に基づいているため、Alex Martelliの回答に対するコメントとして本当に意味していました;しかし、最初に投稿したとき、コメントするのに十分な評判がありませんでした)

アレックスの答えは、実際には意図した結果を生成しません。私は、辞書のリストのリストを持つことの細かい点や、リスト間のコンマの欠如を意味するものではありません (これについては後で詳しく説明します)。しかし、元の質問では、結果として、すべてのメダルを国別、競技会別に編集する必要がありました。アレックスのソリューションは次のように答えます。

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

質問のデータは少しわかりにくいですが、2 つの可能性があります。

1) 表示されているデータは実際には3 つの異なる例であり、タスクは各リスト内の辞書エントリを個別にマージすることです。つまり、

[{'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) 2 番目の可能性は、問題のデータが 3 つのリストを含む 1 つの単一のリストであり、それぞれに dict が含まれていることです。これは元の質問の意味ではないと思いますが、そのためのコードを既に書いているので、ここにあります:)

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 に答える