Фильтрация записей из списков

#python #list

#python #Список

Вопрос:

Я новичок в python и хотел бы получить некоторую помощь, был бы признателен, если бы кто-нибудь мог помочь,

У меня есть список списка на языке python ниже, и я хочу сформировать новый список, который будет содержать последний подсписок на основе первого элемента подсписка, например. ISIN=BE0974302342, я хочу добавить только [‘BE0974302342’, 21, 19, 0, 2, 0] к новому списку и игнорировать все первые вхождения, я подумал об использовании циклов for для сравнения первого элемента каждого подсписка с первым элементом второго подсписка, но это было бы нечистый способ, может ли это быть достигнуто с помощью понимания списка или какого-либо встроенного метода?

 my_list = [['BE0974302342', 21, 0, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 2, 0], 
           ['FR0000073843', 22, 19, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000076861', 21, 20, 0, 2, 0], 
           ['FR0000076861', 21, 18, 0, 2, 0], 
           ['FR0000076861', 21, 18, 3, 2, 0], 
           ['FR0000076861', 21, 18, 3, 3, 0]]

 new_list = [['BE0974302342', 21, 19, 0, 2, 0], 
             ['FR0000073843', 22, 20, 0, 2, 0], 
             ['FR0000076861', 21, 18, 3, 3, 0]]
 

Ответ №1:

Вы могли бы использовать itertools.groupby для группировки подсписков по первому элементу и сохранения последнего подсписка каждой группы:

 from itertools import groupby
from operator import itemgetter

[list(v)[-1] for _,v in groupby(my_list, key=itemgetter(0))]
 

Выходной сигнал

 [['BE0974302342', 21, 19, 0, 2, 0],
 ['FR0000073843', 22, 20, 0, 2, 0],
 ['FR0000076861', 21, 18, 3, 3, 0]]
 

Ответ №2:

 my_list = [['BE0974302342', 21, 0, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 0, 0], 
           ['BE0974302342', 21, 19, 0, 2, 0], 
           ['FR0000073843', 22, 19, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000073843', 22, 20, 0, 2, 0], 
           ['FR0000076861', 21, 20, 0, 2, 0], 
           ['FR0000076861', 21, 18, 0, 2, 0], 
           ['FR0000076861', 21, 18, 3, 2, 0], 
           ['FR0000076861', 21, 18, 3, 3, 0]]

my_list_dict = {}
new_list = []

# Unique Items with id as key and rest as values
for item in my_list:
    my_list_dict[item[0]] = item[1:]

# Convert them back to a list
for k,v in my_list_dict.items():
    new_list.append([k,*v])

print(new_list)
 

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

1. Большое спасибо за решение 🙂

Ответ №3:

однострочный (без использования какого-либо импорта):

 print(list({(x[0]): x for x in my_list}.values()))
 

ВЫВОД:

 [['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], 
 ['FR0000076861', 21, 18, 3, 3, 0]]
 

Разработка:

Идея состоит в том, чтобы сопоставить каждый первый элемент вложенного списка с самим списком в виде key-val пары, поскольку dict не может иметь повторяющихся ключей, он обработает это для нас:

 print({x[0]: x for x in my_list})  
 

Вернет что-то вроде:

 {'BE0974302342': ['BE0974302342', 21, 19, 0, 2, 0], 'FR0000073843': ['FR0000073843', 22, 20, 0, 2, 0], 'FR0000076861': ['FR0000076861', 21, 18, 3, 3, 0]}
 

Теперь у нас уже есть уникальная key-val пара списков, получение значений из dict которых даст нам уникальные вложенные списки:

 print({x[0]: x for x in my_list}.values())
 

Что дало бы нам dict list :

 dict_values([['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], ['FR0000076861', 21, 18, 3, 3, 0]])
 

Теперь мы можем преобразовать его в список:

 print(list({(x[0]): x for x in my_list}.values()))
 

Это просто дало бы нам требуемые уникальные списки на основе первого элемента внутри них:

 [['BE0974302342', 21, 19, 0, 2, 0], ['FR0000073843', 22, 20, 0, 2, 0], 
 ['FR0000076861', 21, 18, 3, 3, 0]]
 

Ответ №4:

Вот альтернативный подход, который не требует itertools :

 tmp = { x[0]:x for x in my_list }
new_list = list(tmp.values())
 

tmp Dict содержит последнее вхождение первого элемента в подсписках. Единственная проблема заключается в том, что подсписки будут отображаться в порядке, отличном от исходного ввода:

 new_list
=> [['FR0000073843', 22, 20, 0, 2, 0],
    ['FR0000076861', 21, 18, 3, 3, 0],
    ['BE0974302342', 21, 19, 0, 2, 0]]
 

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

1. Большое спасибо за решение, порядок не будет иметь значения, поскольку я буду ссылаться на записи, используя ключ