web-dev-qa-db-ja.com

複数のキーで辞書のリストをグループ化して集約する

辞書(List[Dict, Dict, ...])を含むリストがあります。2つのキーに基づいてリストを単一化しますが、別のキーの値を辞書に保持して、保持したいキーのリスト。私はコードにPython=を使用しています。それが重要である場合Python 3.xです。

次の3つのキーを持つ辞書のリストがあるとします:numberfavoritecolor。キーnumberfavoriteを使用してリスト要素を単一化したいと思います。ただし、numberfavoriteの値が同じ辞書の場合、colorcolorの同じ組み合わせに対するすべてのnumbersが確実に得られるように、favoriteキーの下にリストを追加します。同じ組み合わせでcolorsを繰り返す必要がないため、このリストも一意である必要があります。ただし、最終結果にキーカラーの要素が1つしかない場合は、リストではなく文字列である必要があります。

lst = [
{'number': 1, 'favorite': False, 'color': 'red'},
{'number': 1, 'favorite': False, 'color': 'green'},
{'number': 1, 'favorite': False, 'color': 'red'},
{'number': 1, 'favorite': True, 'color': 'red'},
{'number': 2, 'favorite': False, 'color': 'red'}]

前述のuniqifyを使用すると、次の結果が得られます。

lst = [
    {'number': 1, 'favorite': False, 'color': {'red', 'green'}},
    {'number': 1, 'favorite': True, 'color': 'red'},
    {'number': 2, 'favorite': False, 'color': 'red'},
]

red1であり、numberfavoriteであるFalseのインスタンスは1つしかないことに注意してください。また、2番目の辞書のcolorキーの要素が1つしかない場合、それは文字列であり、リストではないことに注意してください。

15
KaanTheGuru

これを行う1つの方法を次に示します。

最初にタプルを複合キーとして使用してdictを作成し、次にそのdictから新しいリストを作成しました。理解度を記述して、行をさらに減らして最適化することができます。

new_dict = {}

for item in lst:
    try: # if already exists then append to the list
        new_dict.get((item['number'], item['favorite']))
        new_dict[(item['number'], item['favorite'])].append(item['color'])
    except KeyError: # if it doesn't then create a new entry to that key
        new_dict[(item['number'], item['favorite'])] = [item['color']]


final_list = []
for k, v in new_dict.items(): # keep appending dicts to our list
    final_list.append({'number': k[0], 'favorite': k[1], 'color':set(v)})

print(final_list)

出力:

[{'number': 1, 'favorite': False, 'color': {'green', 'red'}}, {'number': 1, 'favorite': True, 'color': {'red'}}, {'number': 2, 'favorite': False, 'color': {'red'}}]
0
Vineeth Sai

私の友人は、この問題を解決するために、外部ライブラリを使用せずに次の関数を作成しました。

def uniqifyColors(l):
    for elem in l:
        for item in l:
            if elem['number'] == item['number'] and elem['favorite'] == item['favorite']:
                for clr in item['color']:
                    if clr not in elem['color']:
                        elem['color'].append(clr)
    return l

このPython関数を使用した後、彼はリストから一意の結果を取得するために簡単な一意化を行いました。ただし、単一の色を文字列として保持するのではなく、単一の要素。

0
KaanTheGuru