Удалить элементы из списка кортежей Python

Подскажите, как можно удалить элементы из списка кортежей по по определенному признаку.

Список создаётся из пользовательского ввода, например:

[(1, 1), (2,-1), (3,-1), (3,-1), (3,1), (3,1), (4,-1)] 

по принципу:

  • кортеж состоит только из двух элементов
  • первый элемент кортежа любое число, второй - либо 1, либо -1.
  • из списка удалить все кортежи в которых совпадает первый элемент и отличается второй. В примере это (3,1) и (3, -1)

Ответы (5 шт):

Автор решения: timur
def func(l):
    for i in l:
        try:
            l.remove((i[0], -i[1])) # пробуем удалить элемент с такой же первой цифрой и противоположной второй
        except ValueError:          # если элемент не найден, переходим к следующему
            continue
        l.remove(i) # если же элемент найден, то удаляем и изначальный
        func(l)     # вызываем функцию заново с изменённым списком
        break       # выходим из цикла
→ Ссылка
Автор решения: strawdog
import numpy as np
lst = [(1, 1), (2,-1), (3,-1), (3,-1), (3,1), (3,1), (4,-1), (4,-1, 18)] 
comp = [x for x in lst if (x[1] in [-1,1]) and (len(x)<3)]
v, c = np.unique(np.array(comp), axis=0, return_counts=True)
res =[tuple(x[0]) for x in zip(v,c) if x[1]==1]

тогда res будет:

[(1, 1), (2, -1), (4, -1)]
→ Ссылка
Автор решения: S. Nick

Как вариант:

_list = [(1, 1), (2,-1), (3,-1), (3,-1), (3,1), (3,1), (3,1), (4,-1)]
_dict = {}

for item in _list:
    k, v = item
    if _dict.get(k, None) is None: 
        _dict[k] = v
    else:
        _dict.update([(k, 0)])

new_lst = [ (k, v) for k, v in _dict.items() if v ]
print(new_lst)


# [(1, 1), (2, -1), (4, -1)]
→ Ссылка
Автор решения: Sergey Rufanov

Если условие 2 действительно всегда будет выполнятся, т.е. второй элемент tuple может иметь только значения 1 либо -1, тогда решение "в лоб":

a = [(1, 1), (2, -1), (3, -1), (3, -1), (3, 1), (3, 1), (4, -1)]

result = [(k, v) for k, v in a if not ((k,1) in a and (k, -1) in a)]
# result = [(1, 1), (2, -1), (4, -1)]

Если могут присутствовать и другие значения, то можно использовать:

result = [(k, v) for k, v in a if not any(fk == k and fv != v for fk, fv in a)]
→ Ссылка
Автор решения: Namerek
a = [(1, 1), (2, -1), (3, -1), (3, -1), (3, 1), (3, 1), (4, -1)]
print(
    [
        *filter(
            lambda x: (x[0], -x[1],) not in a, a
        )
    ]
)

# [(1, 1), (2, -1), (4, -1)]
→ Ссылка