Дубликаты по индексу [0] кортежей в списке, сравнивая значение дубликатов, возвращая список дубликатов с наименьшим значением - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время у меня есть список кортежей со следующим синтаксисом:

List = [(FID, LEVEL, REL_SIZE),(FID, LEVEL, REL_SIZE), ...]

Так, например:

List = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), (40, -1, 32.159), (40, 0, 50.408)]

Что мне нужно для моего кода Python, так это найти все дубликатыFID (индекс 0), из дубликатов сравните REL_SIZE (индекс 2) и верните кортеж с наименьшим значением для REL_SIZE в новом списке.

Таким образом, в качестве возврата приведенного выше примера:

New_list = [(23, 0, 43.193), (40, -1, 32.159)]

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Мы будем использовать словарь для группировки кортежей по FID.Затем мы возвращаемся к значениям этого словаря и берем минимальное значение REL_SIZE для тех, у кого более одного кортежа.

from collections import defaultdict
from operator import itemgetter

l = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), (40, -1, 32.159), (40, 0, 50.408)]

d = defaultdict(list)
for t in l:
    d[t[0]].append(t)

print([min(tups, key=itemgetter(2)) for tups in d.values() if len(tups) > 1])
# [(40, -1, 32.159), (23, 0, 43.193)]

Недостатком этого метода является то, что вы можете потерять порядок вашего входного списка,в зависимости от того, какую версию Python вы используете.

0 голосов
/ 12 июня 2018

Использование itertools.groupby()

from itertools import groupby
List = [(22, 0, 40.210), (23, 0, 43.193), (23, 1, 80.867), 
        (40, -1, 32.159), (40, 0, 50.408)]

groups = [list(g) for _,g in groupby(sorted(List), key=lambda t:t[0])]
x = [min(g, key=lambda t:t[2]) for g in groups if len(g) > 1]

Производит:

[(23, 0, 43.193), (40, -1, 32.159)]

РЕДАКТИРОВАТЬ: Ваш разъясняющий комментарий добавляет морщинку.Это будет включать в себя (22, ...) кортеж, хотя дубликатов нет. Исправлено.

...