Сравнение многомерного списка на уникальность по заданным значениям

Есть многомерный список примерно в 20К строк.

Значения КОД, ЦЕНА, НАИМЕНОВАНИЕ, КАРТИНКА:

list_ = [[1, 10.00, 'помидор', 'путь к jpg'], [1, 11.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблоко', None], [2, 25.00, 'яблоко', 'путь к jpg'], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]

Не получается сравнить список на уникальность по коду и мин. цене.

Результат должен быть:

list_2 = [[1, 10.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблуко', None], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]

unique , и set результат не дали.

Кто-то уже сталкивался с подобной проблемой?


Ответы (1 шт):

Автор решения: MaxU

Воспользуйтесь модулем Pandas:

import pandas as pd #  pip install pandas

создаем Pandas DataFrame из списка записей:

df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])

получилось:

In [93]: df
Out[93]:
   ID  price     name        path
0   1   10.0  помидор  путь к jpg
1   1   11.0  помидор  путь к jpg
2   2   20.0   яблоко        None
3   2   25.0   яблоко  путь к jpg
4   3   25.0    Банан  путь к jpg
5   4   25.0   Персик        None

убираем дубликаты, оставляя записи с минимальной ценой:

res = df.sort_values("price").drop_duplicates(subset=["ID"])

результат:

In [95]: res
Out[95]:
   ID  price     name        path
0   1   10.0  помидор  путь к jpg
2   2   20.0   яблоко        None
4   3   25.0    Банан  путь к jpg
5   4   25.0   Персик        None

результат в виде списка:

res_list = res.to_numpy().tolist()

In [97]: res_list
Out[97]:
[[1, 10.0, 'помидор', 'путь к jpg'],
 [2, 20.0, 'яблоко', None],
 [3, 25.0, 'Банан', 'путь к jpg'],
 [4, 25.0, 'Персик', None]]

UPD:

В колонке "Прайс" есть цены в виде строки, '25.00'. как на лету их преобразовать в float.

df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])

df["price"] = pd.to_numeric(df["price"], errors="coerce")

res = df.sort_values("price").drop_duplicates(subset=["ID"])
→ Ссылка