Сопоставьте два списка списков разного размера и верните разницу

У меня есть два списка:

l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W].......]

Теперь я хочу сравнить эти два списка и извлечь несопоставленную часть из l2 в новый список. Я хочу сказать, что он должен соответствовать l1[1] с полем l2[1] и возвращать несоответствующий список. Соответствие означает, что когда элемент во 2-й позиции подсписка l1 сравнивается с той же позицией в подсписках l2, им следует пренебречь, а все, что не соответствует, должно быть возвращено. На самом деле я должен перебрать оба списка, чтобы получить элемент сравнения. например, 3,2 в l1 и при сравнении он должен вернуть подсписок со вторым позиционным элементом 1. Это мой подход:

l3=[x for x in l2 if x[1] not in l1[1]]

Но он возвращает мне даже подходящую часть. Что с ней не так?

2 ответа

l1=[[12,3,C,-],[10,2,A,-]]
l2=[[8,3,X,W],[15,2,Y,W],[16,2,X,W],[17,3,V,W],[20,2,Z,W],[21,1,V,W]]

Ваш подход был близко, но вы хотите использовать map функция для создания списка вторых элементов в l1

l3=[x for x in l2 if x[1] not in map( lambda y: y[1], l1) ]

Заметка map берет функцию и последовательность и возвращает список результатов функции при применении к каждому члену последовательности (то есть ко второму элементу каждого подсписка в l1). Если l1 очень большой, вы можете сделать набор вторых элементов, которые будут удалять дубликаты и проверять членство O(1).

l1set = set( map( lambda y: y[1], l1) )

затем создание l3 будет выглядеть так,

l3=[x for x in l2 if x[1] not in l1set ]

Соответствие означает, что когда элемент во 2-й позиции подсписка l1 сравнивается с той же позицией в подсписках l2, им следует пренебречь, а все, что не соответствует, должно быть возвращено.

Попробуйте добавить приведенное выше утверждение в свой комментарий к своему вопросу.

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

Пройдите второй список и отфильтруйте его, сравнив с сокращенным списком, используя оператор членства

>>> l1=[[12,3,'C','-'],[10,2,'A','-']]
>>> l2=[[8,3,'X','W'],[15,2,'Y','W'],[16,2,'X','W'],[17,3,'V','W'],[20,2,'Z','W'],[21,1,'V','W']]
>>> key = set(e[1] for e in l1)
>>> [e for e in l2 if e[1] not in key]
[[21, 1, 'V', 'W']]
Другие вопросы по тегам