#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. Большое спасибо за решение, порядок не будет иметь значения, поскольку я буду ссылаться на записи, используя ключ