2015-03-07 2 views
1

У меня есть список кортежей, какСписка кортежей удаления

[(1,1),(2,1),(2,2),(5,2),(5,6)] 

Как получить

[(1,1),(2,2),(5,6)] 

Если левая сторона кортежа же только правая сторона по величине кортежа сохраняется Если некоторые кортежи имеют одинаковое левое значение, тогда кортеж с наибольшим правым значением должен быть в списке других кортежей, которые не имеют одинаковых левых (первых) значений для конкуренции, должны оставаться такими, какими они являются

ответ

2

Вам не нужны коллекции или какая-либо причудливая библиотека. Скажем, у нас есть список кортежей, как это (который немного грязнее, чем ваш собственный пример):

listt = [(8, 1),(1, 1),(2, 1),(2, 2),(5, 2),(5, 6)] 

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

listt = sorted(listt,key=lambda x: x[0]) 
# Now we have [(1, 1), (2, 1), (2, 2), (5, 2), (5, 6), (8, 1)] 

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

new_listt = [] 
elem_0 = listt[0][0] 

for i in range(len(listt)-1): 
    if listt[i+1][0] != elem_0: 
     new_listt.append(listt[i]) 
     elem_0 = listt[i+1][0] 

#We have to also account for the last element  
new_listt.append(listt[i+1]) 

Мы можем проверить, работает ли он:

print(listt) 
print("====") 
print(new_listt) 

В моем примере это дает назад [(1, 1), (2, 2), (5, 6), (8, 4)] и с listt = [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)] он дает [(2, 3), (3, 1), (5, 1)], который, я полагаю, верен.

+1

В качестве более эффективного способа вы можете использовать 'operator.itemgetter' вместо вызова' lambda' в 'sorted'. 'Сортирован (listt, ключ = itemgetter (0))' – Kasramvd

3

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

Примечание питона ДИКТ/комплект не следуют какой-либо определенной порядке, поэтому важно использования заказанного Словаре

>>> from collections import OrderedDict 
>>> lst = [(1,1),(2,1),(2,2),(5,2),(5,6)] 
>>> OrderedDict(sorted(lst)).items() 
[(1, 1), (2, 2), (5, 6)] 
>>> lst = [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)] 
>>> OrderedDict(sorted(lst)).items() 
[(2, 3), (3, 1), (5, 1)] 

Другой подход, хотя немного запутанным, чтобы использовать GroupBy. Какой из них лучше субъективен и требует сравнения производительности.

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> lst = [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)] 
>>> [max(v) for k, v in groupby(sorted(lst), key = itemgetter(0))] 
[(2, 3), (3, 1), (5, 1)] 
>>> lst = [(1,1),(2,1),(2,2),(5,2),(5,6)] 
>>> [max(v) for k, v in groupby(sorted(lst), key = itemgetter(0))] 
[(1, 1), (2, 2), (5, 6)] 
Смежные вопросы