Фильтр - это функция, которая возвращает список всех истинных возвратов функции, используемой как filter(function(), iterator)
.
def compare(one, two):
for i in two:
if i[0]==one[0]:
print("yes:", one,two)
return False
return True
l1 = [('c','d'),('c','e'),('a','b'),('a', 'd')]
l2 = [('a','c'),('b','d')]
one_liner = lambda n: compare(l1[n], l2) # where n is the tuple in the first list
lets_filter = list(filter(one_liner, range(len(l1))))
final_list = l2.copy()
for i in lets_filter:
final_list.append(l1[i])
print(final_list)
Я сделал это как способ сделать это. Лямбда может быть немного запутанной, будьте бдительны, если вы этого не понимаете, и я переделаю это.
Понимание списка - это «троичный оператор», если вы с ним знакомы, для составления списка в одну строку.
l1 = [('c','d'),('c','e'),('a','b'),('a', 'd')]
l2 = [('a','c'),('b','d')]
l3 = [l1[n] for n in range(len(l1)) if l1[n][0] not in [l2[i][0] for i in range(len(l2))]]+l2
print(l3)
Этот код делает свое дело, но сначала он ошеломляющий. Позвольте мне объяснить, что он делает.
l1[n] for n in range(len(l1)
проходит через все пары в l1, чтобы посмотреть, сможем ли мы их добавить. Это делается, когда if возвращает True.
l1[n][0] not in
берет первый элемент и возвращает True, если не существует ни в одном из элементов следующего списка.
[l2[i][0] for i in range(len(l2))]
составляет список из всех первых элементов l2.
+l2
добавляется по запросу.
В качестве бонуса я собираюсь объяснить, как использовать другое в том же сценарии, если вы хотите получить другой результат.
l1 = [('c','d'),('a','b'),('c','e'),('a', 'd')]
l2 = [('a','c'),('b','d')]
l3 = [l1[n] if l1[n][0] not in [l2[i][0] for i in range(len(l2))] else ("not", "you") for n in range(len(l1))]+l2
print(l3)
Как видите, мне пришлось переключать порядок операторов, но работает как надо, добавляя их в правильном порядке l1 (который я изменил ради показа).
![Python script](https://i.stack.imgur.com/Ns7Mv.png)