Удалить элементы из списка кортежей 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)]