уникальный список python на основе элемента

У меня есть список

old_list = [ (1, 'AAA', None, 1), (2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (6, 'ABB', 'x', 1), (9, 'ABB', 'x', 1)] 

Как я хочу получить новый список, есть уникальный i [1] и больший id i [0], как этот результат

 new_list = [ (2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (9, 'ABB', 'x', 1)] ] 

Кто-нибудь может мне помочь?

2 Solutions collect form web for “уникальный список python на основе элемента”

Вы можете использовать itertools.groupby

 old_list = [ (1, 'AAA', None, 1), (2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (6, 'ABB', 'x', 1), (9, 'ABB', 'x', 1)] from itertools import groupby from operator import itemgetter print [sorted(list(group), key=itemgetter(0))[-1] for key, group in groupby(old_list, key=itemgetter(1))] 

Вывод

 [(2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (9, 'ABB', 'x', 1)] 

если old_list уже не отсортирован, вы можете сортировать его так

 old_list = sorted([ (1, 'AAA', None, 1), (2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (6, 'ABB', 'x', 1), (9, 'ABB', 'x', 1)], key=itemgetter(1)) 

Вы можете сделать это:

 d={} for t in old_list: d.setdefault(t[1],[]).append(t) new_list=[] for k in sorted(d): # sort by the keys ('AAA', 'AAB', etc) new_list.append(max(d[k], key=lambda t: t[0])) # max index (t[0]) # [(2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (9, 'ABB', 'x', 1)] 

редактировать

Если нет возможности дублировать идентификаторы, вы можете:

 d={} for t in old_list: d.setdefault(t[1],[]).append(t) new_list=[] for k in sorted(d): new_list.append(d[k][-1]) 

Это тот же ответ с образцами данных.


Изменить 2, Сроки

 from collections import defaultdict s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] def f1(): d = defaultdict(list) for k, v in s: d[k].append(v) return d.items() def f2(): d={} for k, v in s: d.setdefault(k, []).append(v) return d.items() if __name__ == '__main__': import timeit import sys print(sys.version) print('defaultdict:', timeit.timeit("f1()", setup="from __main__ import f1, s")) print('setdefault:', timeit.timeit("f2()", setup="from __main__ import f2, s")) 

Печать:

 3.3.2 (default, Jul 6 2013, 10:40:18) [GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] defaultdict: 2.384568103996571 setdefault: 1.6183147379779257 

И тайминги с сообщением показывают, что это более быстрый способ сделать это:

 from __future__ import print_function from collections import OrderedDict import itertools from operator import itemgetter old_list = [ (1, 'AAA', None, 1), (2, 'AAA', 'x', 0), (5, 'AAB', 'z', 1), (6, 'ABB', 'x', 1), (9, 'ABB', 'x', 1)] def f1(): d={} for t in old_list: d.setdefault(t[1],[]).append(t) new_list=[] for k in sorted(d): new_list.append(d[k][-1]) return new_list def f2(): nl = sorted(old_list, key=itemgetter(2,1)) return OrderedDict((elem[1], elem) for elem in nl).values() def f3(): nl=sorted(old_list, key=lambda x: x[1]) return [sorted(list(group), key=lambda x:x[0], reverse=True)[0] for key, group in itertools.groupby(nl, key=lambda x:x[1])] if __name__ == '__main__': import timeit import sys print(sys.version) print('drewk:',timeit.timeit("f1()", setup="from __main__ import f1, old_list")) print('Abhijit:', timeit.timeit("f2()", setup="from __main__ import f2, old_list, OrderedDict, itemgetter")) print('thefourtheye:', timeit.timeit("f3()", setup="from __main__ import f3, old_list, itertools")) 

Печать:

 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] drewk: 3.30526208878 Abhijit: 20.5611379147 thefourtheye: 13.2195081711 
  • Numpy уникальная 2D-подматрица
  • ListField без дубликатов в Python mongoengine
  • Удаление уникальных элементов из списка
  • Python - лучший язык программирования в мире.