Сравнение Python в списке списков кортежей

Я новичок в python, и у меня вопрос о сравнении в списке кортежей. У меня есть список с дубликатами второго элемента в кортеже, и я хочу напечатать только первый вид этого кортежа. Например, для этого списка:

[(1, 2), (5, 10), (6, 10), (24, 35), (30, 35)] 

У меня есть эта функция:

 def func(lst): list_first = [] #Checks if 2 elements have the same second value. for i in range(len(lst)-1): if(lst[i][1] == lst[i+1][1]): first = (lst[i][0]),lst[i][1] list_first.append(first) #append only the first element print list_first 

Выход моей функции:

 [(5, 10), (24, 35), (30, 35)] 

Но мой ожидаемый результат:

 [(5, 10), (24, 35)] 

Как я могу это исправить?

ОБНОВИТЬ

Я должен сделать весь этот алгоритм в списке списков. Итак, для ввода:

 [[(0, 3), (1, 3), (2, 3), (3, 3), (4, 3)], [(5, 3), (6, 3), (7, 3), (8, 3), (9, 3)], [(10, 3), (11, 3), (12, 3), (13, 3), (14, 3)]] 

Я хочу, чтобы результат был следующим:

 [[(0, 3)], [(5, 3)], [(10, 3)]] 

Я попытался изменить решения, которые я получил здесь. Но все, что у меня было, было:

 [[(0, 3)], [(0, 3)], [(0, 3)]] 

Решение без предположения о сортировке

Вы можете использовать словарь, который использует второе значение в кортеже в качестве ключа. Если этот ключ появляется во второй раз, добавьте уже увиденный кортеж к вашему результату. Не добавляйте снова, если вы видите кортеж третьим или более раз. Добавленный набор содержит уже добавленные записи второго кортежа, если найдено более двух найденных случаев:

 from __future__ import print_function # makes work in Python 2 and 3 def find_first(lst): seen = {} res = [] added = set() for elem in lst: key = elem[1] if key in seen and key not in added: res.append(seen[key]) added.add(key) else: seen[key] = elem return res 

Тестирование с помощью lis. Обратите внимание на последний элемент (60, 10) с повторением 10 в третий раз:

 L = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (60, 10)] print(find_first(L)) 

Вывод:

 [(5, 10), (24, 35)] 

Он НЕ использует сортировку и работает для данных примера:

 L = [(1, 2), (6, 10), (5, 10), (24, 35), (30, 35), (60, 10)] print(find_first(L)) 

Вывод:

 [(6, 10), (24, 35)] 

Решение из другого ответа не работает для этих данных:

 from itertools import groupby L = [(1, 2), (6, 10), (5, 10), (24, 35), (30, 35), (60, 10)] final = [] for _, v in groupby(sorted(a) , lambda x : x[1]): b = list(v) if len(b) > 1: final.append(b[0]) print(final) 

Вывод:

 [(5, 10), (24, 35)] 

Решение для вашего вопроса с использованием groupby из модуля itertools :

Изменить: Как и то, что предлагает @AKS, вот функция с несколькими формами входных данных.

 from itertools import groupby def comp_list(a = list()): final = [] for _, v in groupby(sorted(a, key = lambda x : x[1]) , lambda x : x[1]): b = list(v) if len(b) > 1: final.append(b[0]) return final a1 = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35)] a2 = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (40, 35)] a3 = [(5, 10), (24, 35), (30, 35), (20, 5), (15, 4), (21, 5), (13, 4)] a4 = [(1, 2),(6, 10), (5, 10), (24, 35), (30, 35)] print(comp_list(a1)) print(comp_list(a2)) print(comp_list(a3)) print(comp_list(a4)) 

Вывод:

 [(5, 10), (24, 35)] [(5, 10), (24, 35)] [(15, 4), (20, 5), (24, 35)] [(6, 10), (24, 35)] 

Вот небольшой метод, который может помочь вам здесь

 def removeDuplicateTuple(sampleList): uniqueList = [] entryLog = {} processedEntries = [] for x, y in sampleList: if entryLog.get(y)==None: entryLog[y] = (x,y) else: if(entryLog.get(y) not in processedEntries): uniqueList.append(entryLog.get(y)) processedEntries.append(entryLog.get(y)) return uniqueList 

испытание: [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (45, 2)]

выход: [(5, 10), (24, 35), (1, 2)]