Возвращает только уникальные вхождения из списка списков, основанного на первом элементе

#python #python-3.x #nested-lists

#python #python-3.x #вложенные списки

Вопрос:

Прошу прощения, я считаю, что это распространенный вопрос, но, похоже, не могу найти точный ответ для желаемого результата.

Я хотел бы возвращать ТОЛЬКО уникальные элементы в списке списков, основанных на одном элементе.

Пример;

 List = [[1,2],[2,3],[1,4],[1,5],[6,3]]
  

Желаемый результат;

 List = [[2,3],[6,3]]
  

Поскольку 1 существует как первый элемент в нескольких элементах списка, я бы хотел, чтобы все они игнорировались.

Есть ли простой способ сделать это?

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

1. Каковы правила? Как вы узнаете, что нужно сохранить, [2, 3] а не [1, 2] или [1, 4] ? Что вы имеете в виду «на основе первого элемента»? Что насчет первого элемента говорит нам, следует ли сохранить или выбросить другой элемент?

2. @Code-Apprentice Если позволите, я думаю, что этот вопрос довольно ясен. Каждый кортеж с 1 в качестве первого элемента игнорируется, поскольку существует несколько подсписков с 1 в качестве первого элемента.

3. @Code-Apprentice это объясняется в вопросе: Поскольку 1 существует как первый элемент в нескольких элементах списка, я бы хотел, чтобы все они игнорировались . 2 и 6 отображаются только в одной паре как первый элемент (индекс 0), поэтому они желательны

Ответ №1:

Может возникнуть соблазн использовать list.count , но это сделает решение, использующее его, O (n ^ 2), если использовать наивно.

Решением O (n) было бы использование collections.Counter :

 from collections import Counter

nested_list = [[1,2],[2,3],[1,4],[1,5],[6,3]]

counter_map = Counter(sublist[0] for sublist  in nested_list)
print(counter_map)
output = [sublist for sublist in nested_list if counter_map[sublist[0]] == 1]
print(output)
  

выводит

 Counter({1: 3, 2: 1, 6: 1})
[[2, 3], [6, 3]]