Сравнение 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)]]
- Преобразовать список в список кортежей python
- Сортировка списка списка кортежей
- Конструктор Tuple vs list comp
- Python – короткий способ распаковать список для оператора форматирования строк?
- Возврат наивысших 6 имен в списке кортежей в Python
Решение без предположения о сортировке
Вы можете использовать словарь, который использует второе значение в кортеже в качестве ключа. Если этот ключ появляется во второй раз, добавьте уже увиденный кортеж к вашему результату. Не добавляйте снова, если вы видите кортеж третьим или более раз. Добавленный набор содержит уже добавленные записи второго кортежа, если найдено более двух найденных случаев:
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)]
- Как конкатенировать два элемента из разных списков с помощью python?
- Как добавить значения кортежей y, если значения x одинаковы?
- замена элементов в кортежах
- Как преобразовать вложенный кортеж кортежей и списков в списки списков в Python?
- Python: преобразовать список списков кортежей
- избыточные позиционные аргументы, распаковка списков аргументов или кортежей и расширенная итеративная распаковка
- Добавление записи в кортеж python
- Добавление значений в кортеж, который находится в списке в python
- В чем разница между (1,) и (1) в python