Выбор из списка словарей лучших значений по ключу python
Есть список словарей, который содержит вид фрукта и их количество на двух складах:
list1 = [
{'type':'apple_green','store1':106,'store2':111},
{'type':'apple_red','store1':108,'store2':110},
{'type':'apple_orange','store1':107,'store2':109},
{'type':'potato_yellow','store1':50,'store2':52},
{'type':'berry_yellow','store1':11,'store2':17},
{'type':'berry_green','store1':13,'store2':16}
]
Нужна функция, которая выдает отфильтрованный список словарей, формируя по одному словарю для каждого фрукта с выбором наибольшего значения по ключу 'store1' и наименьшего по ключу 'store2'. Таким образом, выходные данные будут следующими:
list2 = [
{'type':'apple','store1':108,'store2':109},
{'type':'potato','store1':50,'store2':52},
{'type':'berry','store1':13,'store2':16}
]
Буду очень рад помощи!!!
Ответы (3 шт):
Автор решения: Ssssemyon
→ Ссылка
def filter_fruits(lst):
filtered_list = []
for item in lst:
fruit_type = item['type'].split('_')[0]
store1 = item['store1']
store2 = item['store2']
updated = False
for filtered_item in filtered_list:
if filtered_item['type'] == fruit_type:
if store1 > filtered_item['store1']:
filtered_item['store1'] = store1
if store2 < filtered_item['store2']:
filtered_item['store2'] = store2
updated = True
break
if not updated:
filtered_list.append({'type': fruit_type, 'store1': store1, 'store2': store2})
return filtered_list
Автор решения: Stanislav Volodarskiy
→ Ссылка
list1 = [
{'type':'apple_green','store1':106,'store2':111},
{'type':'apple_red','store1':108,'store2':110},
{'type':'apple_orange','store1':107,'store2':109},
{'type':'potato_yellow','store1':50,'store2':52},
{'type':'berry_yellow','store1':11,'store2':17},
{'type':'berry_green','store1':13,'store2':16}
]
acc = {}
for d in list1:
r = acc.setdefault(d['type'].split('_')[0], [d['store1'], d['store2']])
r[0] = max(r[0], d['store1'])
r[1] = min(r[1], d['store2'])
list2 = [
{'type': k, 'store1': s1, 'store2': s2} for k, (s1, s2) in acc.items()
]
print(list2)
[ {'type': 'apple', 'store1': 108, 'store2': 109}, {'type': 'potato', 'store1': 50, 'store2': 52}, {'type': 'berry', 'store1': 13, 'store2': 16} ]
Автор решения: Алексей Р
→ Ссылка
import pandas as pd
list1 = [
{'type': 'apple_green', 'store1': 106, 'store2': 111},
{'type': 'apple_red', 'store1': 108, 'store2': 110},
{'type': 'apple_orange', 'store1': 107, 'store2': 109},
{'type': 'potato_yellow', 'store1': 50, 'store2': 52},
{'type': 'berry_yellow', 'store1': 11, 'store2': 17},
{'type': 'berry_green', 'store1': 13, 'store2': 16}
]
df = pd.DataFrame(list1)
result = df.groupby(df.type.str.split('_').str[0]).agg({'store1': 'max', 'store2': 'min'}).reset_index().to_dict(orient='records')
print(result)
[{'type': 'apple', 'store1': 108, 'store2': 109}, {'type': 'berry', 'store1': 13, 'store2': 16}, {'type': 'potato', 'store1': 50, 'store2': 52}]