Сопоставьте два списка списков разного размера и верните разницу
У меня есть два списка:
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']]