Выбор из списка словарей лучших значений по ключу 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}]
→ Ссылка