Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Как удалить повторяющиеся элементы из двумерного списка?

#python #list


list = [['03:30', 70.0], ['03:30', 135.0], ['03:30', 200.0], ['03:30', 280.0], 
['04:00', 360.0], ['04:00', 430.0], ['04:30', 473.0], ['04:30', 573.0]]


Как удалить элементы с одинаковым временем и оставить с большим числом, чтобы получилось:

list = [['03:30', 280.0], ['04:00', 430.0], ['04:30', 573.0]]

    


Ответы

Ответ 1



In [49]: from itertools import groupby In [50]: res = [max(g) for _,g in groupby(lst, lambda x: x[0])] In [51]: res Out[51]: [['03:30', 280.0], ['04:00', 430.0], ['04:30', 573.0]] можно явно указать ключ для функции max(): In [53]: res = [max(g, key=lambda x: x[1]) for _,g in groupby(lst, lambda x: x[0])] In [54]: res Out[54]: [['03:30', 280.0], ['04:00', 430.0], ['04:30', 573.0]] Данный код группирует список списков по первому элементу: In [57]: for k,g in groupby(lst, lambda x: x[0]): ...: print(k, list(g)) ...: 03:30 [['03:30', 70.0], ['03:30', 135.0], ['03:30', 200.0], ['03:30', 280.0]] 04:00 [['04:00', 360.0], ['04:00', 430.0]] 04:30 [['04:30', 473.0], ['04:30', 573.0]] после этого мы выбираем в каждой группе элемент (список) с максимальным вторым элементом: In [58]: for k,g in groupby(lst, lambda x: x[0]): ...: print(max(g, key=lambda x: x[1])) ...: ['03:30', 280.0] ['04:00', 430.0] ['04:30', 573.0]

Ответ 2



Если исходить их того что данные у вас отсортированы по времени и значению можно сделать так: from collections import OrderedDict data = [['03:30', 70.0], ['03:30', 135.0], ['03:30', 200.0], ['03:30', 280.0], ['04:00', 360.0], ['04:00', 430.0], ['04:30', 473.0], ['04:30', 573.0]] res = list(OrderedDict(data).items()) print(res)

Ответ 3



ну вот вариант без "тяжелой артиллерии" list = [['03:30', 70.0], ['03:30', 135.0], ['03:30', 200.0], ['03:30', 280.0], ['04:00', 360.0], ['04:00', 430.0], ['04:30', 473.0], ['04:30', 573.0]] list.sort(reverse=True) list2 = [list[0]] for key,value in list: if key != list2[-1][0]: list2.append([key,value]) результат в list2. Вообще можно было бы написать цикл начиная со второго элемента: for key,value in list[1:]: ... Но оно бы запутывало глаз...

Ответ 4



Ну а если не иcходить из того что данные отсортированы, то: data = [['03:30', 70.0], ['03:30', 135.0], ['03:30', 200.0], ['03:30', 280.0], ['04:00', 360.0], ['04:00', 430.0], ['04:30', 473.0], ['04:30', 573.0]] data.sort(key=lambda x: x[1]) res = list(dict(data).items()) Как это работает, список конвертируется в словарь, особеностью которого является то, что ключ уникален. Это дает приимущество в том, что при повторном элементе, мы каждый раз заменяем его дублирующимся в списке. Собственно, для этого сортировка и нужна, чтобы последним в списке оказался тот, который нам и нужен.

Комментариев нет:

Отправить комментарий