Вопрос-Ответ

How to find list intersection? [duplicate]

Как найти пересечение списков?
a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c

фактический результат: [1,3,5,6]
ожидаемый результат: [1,3,5]

Как мы можем добиться логической операции AND (пересечение списков) для двух списков?

Переведено автоматически
Ответ 1

Если порядок не важен и вам не нужно беспокоиться о дубликатах, вы можете использовать set intersection:

>>> a = [1,2,3,4,5]
>>> b = [1,3,5,6]
>>> list(set(a) & set(b))
[1, 3, 5]
Ответ 2

Использование понимания списков для меня довольно очевидно. Не уверен насчет производительности, но, по крайней мере, все остается в списках.

[x for x in a if x in b]

Или "все значения x, которые находятся в A, если значение X находится в B".

Ответ 3

Если вы преобразуете больший из двух списков в набор, вы можете получить пересечение этого набора с любым итерируемым с помощью intersection():

a = [1,2,3,4,5]
b = [1,3,5,6]
set(a).intersection(b)
Ответ 4

Создайте набор из большего списка:

_auxset = set(a)

Тогда,

c = [x for x in b if x in _auxset]

будет делать то, что вы хотите (сохраняя bпорядок, а не a's - не обязательно сохранять оба) и делать это быстро. (Использование if x in a в качестве условия понимания списка также сработало бы и избавило бы от необходимости построения _auxset, но, к сожалению, для списков значительной длины это было бы намного медленнее).

Если вы хотите, чтобы результат был отсортирован, а не сохранялся порядок в обоих списках, еще более аккуратным способом может быть:

c = sorted(set(a).intersection(b))
python arrays