2016-12-18 1 views
0

Если кто-нибудь, у кого есть идея о том, как улучшить название, более чем приветствуется!Из списка словарей отфильтровать, для каждого элемента, это самое низкое значение

У меня есть список словарей:

list = [ 
    { 'id' : 1, 'value' : 1 }, 
    { 'id' : 2, 'value' : 2 }, 
    { 'id' : 1, 'value' : 2 }, 
    { 'id : 2, 'value' : 1 }, 
] 

Я отсортирован его key=itemgetter('id','value') и получить

list = [ 
    { 'id' : 1, 'value' : 1 }, 
    { 'id' : 1, 'value' : 2 }, 
    { 'id' : 2, 'value' : 1 }, 
    { 'id : 2, 'value' : 2 }, 
] 

Теперь я хочу, чтобы отфильтровать, для каждого идентификатора, это самое низкое значение, чтобы получить

list = [ 
    { 'id' : 1, 'value' : 1 }, 
    { 'id' : 2, 'value' : 1 }, 
] 

Мое текущее решение что-то вроде этого

new_list = [] 
old_id = -1 
for item in list: 
    new_id = item['id'] 
    if new_id != old_id: 
     new_list.append(item) 
     old_id = new_id 

Но я видел много интересных вещей, сделанных здесь с фильтрами, картой, сокращением, функциями лямбда и пониманием списка, и начал допрос, если может быть более чистое решение моей проблемы?

+0

Посмотрите в ' itertools.groupby'. Но если код, который у вас есть, переходите к следующей полезной части. – jonrsharpe

+1

Я думаю, вы хотели написать 'new_list.append (item)' –

+0

Спасибо, Джим, отредактировал его в :) – MrJalapeno

ответ

3

Поскольку список был отсортирован по id и value, вы можете сгруппировать по id и принять первый элемент из каждой группы, которая должна иметь наименьшее значение для ид:

from itertools import groupby 
[next(g) for _, g in groupby(lst, key = lambda d: d['id'])] 
# [{'id': 1, 'value': 1}, {'id': 2, 'value': 1}]