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

Аватара пользователя
constan.costia
Сообщения: 16
Зарегистрирован: 15 ноя 2017, 16:49

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

16 ноя 2017, 19:17

Код: Выделить всё

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]]

Аватара пользователя
stepanovyri
Сообщения: 17
Зарегистрирован: 15 ноя 2017, 15:27

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

16 ноя 2017, 19:55

Код: Выделить всё

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]
Последний раз редактировалось stepanovyri 16 ноя 2017, 19:58, всего редактировалось 1 раз.

Аватара пользователя
constan.costia
Сообщения: 16
Зарегистрирован: 15 ноя 2017, 16:49

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

16 ноя 2017, 19:56

Не понимаю как этот код работает, но он работает. Спасибо!

Аватара пользователя
stepanovyri
Сообщения: 17
Зарегистрирован: 15 ноя 2017, 15:27

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

16 ноя 2017, 19:58

Добавил небольшое пояснение в ответ..

Аватара пользователя
alexrozd8
Сообщения: 7
Зарегистрирован: 15 ноя 2017, 15:29

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

16 ноя 2017, 19:59

constan.costia писал(а):
16 ноя 2017, 19:56
Не понимаю как этот код работает, но он работает. Спасибо!
работает - не трогай.

Аватара пользователя
ianavei
Сообщения: 4
Зарегистрирован: 15 ноя 2017, 17:35

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

16 ноя 2017, 20:02

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

Аватара пользователя
volkwnseym
Сообщения: 6
Зарегистрирован: 15 ноя 2017, 17:26

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

16 ноя 2017, 20:05

ну вот вариант без "тяжелой артиллерии"

Код: Выделить всё

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:]:
    ...
Но оно бы запутывало глаз...

Аватара пользователя
ev.eriomkin
Сообщения: 12
Зарегистрирован: 15 ноя 2017, 16:54

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

16 ноя 2017, 20:07

Если исходить их того что данные у вас отсортированы по времени и значению можно сделать так:

Код: Выделить всё

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)

Аватара пользователя
volkwnseym
Сообщения: 6
Зарегистрирован: 15 ноя 2017, 17:26

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

16 ноя 2017, 20:08

ну наверное и обычным словарем можно было бы обойтись, однако - браво )

Аватара пользователя
ianavei
Сообщения: 4
Зарегистрирован: 15 ноя 2017, 17:35

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

16 ноя 2017, 20:12

Ну а если не и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())
Как это работает, список конвертируется в словарь, особеностью которого является то, что ключ уникален. Это дает приимущество в том, что при повторном элементе, мы каждый раз заменяем его дублирующимся в списке. Собственно, для этого сортировка и нужна, чтобы последним в списке оказался тот, который нам и нужен.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость