Фильтрация записей из списков - PullRequest
1 голос
/ 18 апреля 2019

Я новичок в 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]]

Ответы [ 4 ]

4 голосов
/ 18 апреля 2019

Вы можете использовать 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]]
3 голосов
/ 18 апреля 2019
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)
2 голосов
/ 18 апреля 2019

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

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]]
2 голосов
/ 18 апреля 2019

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

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

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

new_list
=> [['FR0000073843', 22, 20, 0, 2, 0],
    ['FR0000076861', 21, 18, 3, 3, 0],
    ['BE0974302342', 21, 19, 0, 2, 0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...