辞書(List[Dict, Dict, ...]
)を含むリストがあります。2つのキーに基づいてリストを単一化しますが、別のキーの値を辞書に保持して、保持したいキーのリスト。私はコードにPython=を使用しています。それが重要である場合Python 3.xです。
次の3つのキーを持つ辞書のリストがあるとします:number
、favorite
、color
。キーnumber
とfavorite
を使用してリスト要素を単一化したいと思います。ただし、number
とfavorite
の値が同じ辞書の場合、color
とcolor
の同じ組み合わせに対するすべてのnumber
sが確実に得られるように、favorite
キーの下にリストを追加します。同じ組み合わせでcolor
sを繰り返す必要がないため、このリストも一意である必要があります。ただし、最終結果にキーカラーの要素が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'},
]
red
が1
であり、number
がfavorite
であるFalse
のインスタンスは1つしかないことに注意してください。また、2番目の辞書のcolor
キーの要素が1つしかない場合、それは文字列であり、リストではないことに注意してください。
これを行う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'}}]
私の友人は、この問題を解決するために、外部ライブラリを使用せずに次の関数を作成しました。
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関数を使用した後、彼はリストから一意の結果を取得するために簡単な一意化を行いました。ただし、単一の色を文字列として保持するのではなく、単一の要素。