Получить кортежи с максимальным значением из каждого ключа из списка - PullRequest
3 голосов
/ 29 сентября 2011

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

[(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]

Я хочу, чтобы кортежи с максимальным первым значением каждого кортежа были одинаковыми.Например, (2, 1) и (3, 1) имеют одно и то же второе (ключевое) значение, поэтому я просто хочу сохранить значение с максимальным первым значением -> (3, 1).В конце концов я получу это:

[(1, 0), (3, 1), (6, 2), (2, 3)]

Я не против, если это не однострочный текст, но мне было интересно найти эффективный способ сделать это...

Ответы [ 4 ]

6 голосов
/ 29 сентября 2011
from operator import itemgetter
from itertools import groupby

[max(items) for key, items in groupby(L,key = itemgetter(1))]

Предполагается, что ваш начальный список кортежей отсортирован по ключевым значениям.

groupby создает итератор, который выдает объекты типа (0, <itertools._grouper object at 0x01321330>), где первое значение является значением ключа,второй - другой итератор, который выдает все кортежи с этим ключом.

max(items) просто выбирает кортеж с максимальным значением, и так как все вторые значения группы одинаковы (а также является ключом), он дает кортеж с максимальным первым значением.

Понимание списка используется для формирования выходного списка кортежей на основе вывода этих функций.

2 голосов
/ 29 сентября 2011

Вероятно, используя диктовку:

rd = {}
for V,K in my_tuples:
  if V > rd.setdefault(K,V):
    rd[K] = V
result = [ (V,K) for K,V in rd.items() ]
0 голосов
/ 29 сентября 2011

Вы можете использовать словарь, связанный со вторым элементом кортежа:

l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
d = dict([(t[1], None) for t in l])
for v, k in l:
  if d[k] < v:
    d[k] = v 
l2 = [ (v, k) for (k, v) in d.items() if v != None ]
print l2
0 голосов
/ 29 сентября 2011
import itertools
import operator
l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
result = list(max(v, key=operator.itemgetter(0)) for k, v in itertools.groupby(l, operator.itemgetter(1)))
...