0

私は辞書のリストを持っているとしましょう:

list = [{'name':'john','age':'28','location':'hawaii','gender':'male'},
        {'name':'john','age':'32','location':'colorado','gender':'male'},
        {'name':'john','age':'32','location':'colorado','gender':'male'},
        {'name':'parker','age':'24','location':'new york','gender':'male'}]

この辞書では、「名前」は一意の識別子と見なすことができます。私の目標は、このリストを同一の辞書 (つまり、リスト [1] とリスト [2]) に対して重複除去するだけでなく、単一の「名前」 (つまり、リスト [0] とリスト [1/2] に対して異なる値をマージ/追加することです。 ]. つまり、次のように、私の例のすべての 'name'='john' dict を 1 つの dict にマージしたいと思います。

dedup_list = [{'name':'john','age':'28; 32','location':'hawaii; colorado','gender':'male'},
              {'name':'parker','age':'24','location':'new york','gender':'male'} ]

これまで、2 番目のリストである dedup_list を作成し、最初のリストを繰り返し処理しようとしました。dedup_list の dicts の 1 つに「name」キーがまだ存在しない場合は、追加します。行き詰まっているのは合流部分です。

for dict in list:
    for new_dict in dedup_list:
        if dict['name'] in new_dict:
            # MERGE OTHER DICT FIELDS HERE
        else:
            dedup_list.append(dict) # This will create duplicate values as it iterates through each row of the dedup_list.  I can throw them in a set later to remove?

私の辞書のリストには 100 を超えるアイテムが含まれることはないため、O(n^2) ソリューションは間違いなく受け入れられますが、必ずしも理想的ではありません。この dedup_list は最終的に CSV に書き込まれるので、それに関する解決策があれば、私はすべて耳にします。

ありがとう!

4

1 に答える 1

2

まあ、私は解決策を作成しようとしていましたdefaultdictが、@hivert が私が思いついた最善の解決策を投稿したことを願っています。これはこの回答にあります。

from collections import defaultdict

dicts = [{'a':1, 'b':2, 'c':3},
         {'a':1, 'd':2, 'c':'foo'},
         {'e':57, 'c':3} ]

super_dict = defaultdict(set)  # uses set to avoid duplicates

for d in dicts:
    for k, v in d.iteritems():
        super_dict[k].add(v)

つまり、私はその質問のだまされとして、この質問を閉じることに投票しています。

注意: などの値を取得することはありませんが'28; 32'、代わりに を含むセットを取得し[28,32]ます。これは、必要に応じて csv ファイルに処理できます。

NB2: csv ファイルを書き込むには、DictWriterクラスを見てください。

于 2014-03-12T18:08:07.837 に答える