a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
фактический результат: [1,3,5,6]
ожидаемый результат:[1,3,5]
Как мы можем достичь логической операции И (пересечение списков) в двух списках?
python
arrays
intersection
csguy11
источник
источник
a and b
работает так, как в следующем утверждении из документации упоминается: « Выражениеx and y
сначала вычисляетсяx
; еслиx
ложно, его значение возвращается; в противном случаеy
вычисляется и возвращается полученное значение. »Ответы:
Если порядок не важен и вам не нужно беспокоиться о дубликатах, вы можете использовать пересечение множеств:
источник
a = [1,1,2,3,4,5]
иb = [1,1,3,5,6]
тогда пересечение будет,[1,1,3,5]
но вышеупомянутым методом это приведет только к одному,1
то есть,[1, 3, 5]
что будет способ записи сделать это тогда?intersection
обычно считается установленным на основе. Вы ищете немного другое животное - и вам может понадобиться сделать это вручную, отсортировав каждый список и объединив результаты - и сохранив дубликаты в объединении.Использование списочных представлений для меня довольно очевидно. Не уверен насчет производительности, но, по крайней мере, вещи остаются в списках.
[x for x in a if x in b]
Или «все значения х в A, если значение X в B».
источник
b
сет, и у тебя будет O (n)Если вы преобразуете больший из двух списков в набор, вы можете получить пересечение этого набора с любой итерацией, используя
intersection()
:источник
list(set(a) & set(b))
Сделайте набор из большего:
Затем,
будет делать то, что вы хотите (сохраняя
b
порядок, а неa
- не обязательно сохранить оба ) и делать это быстро . (Использованиеif x in a
в качестве условия в понимании списка также будет работать, и избежать необходимости строить_auxset
, но, к сожалению, для списков существенной длины это было бы намного медленнее).Если вы хотите, чтобы результат был отсортирован, а не сохранен порядок любого из списков, более аккуратный способ может быть следующим:
источник
Вот некоторый код Python 2 / Python 3, который генерирует информацию о синхронизации для основанных на списках и основанных на множестве методов нахождения пересечения двух списков.
Чистые алгоритмы понимания списка O (n ^ 2), поскольку
in
в списке есть линейный поиск. Основанные на множестве алгоритмы O (n), так как поиск множества O (1), а создание множества O (n) (и преобразование множества в список также O (n)). Таким образом, для достаточно больших n алгоритмы, основанные на множестве, быстрее, но для малых n накладные расходы на создание набора (ов) делают их медленнее, чем чистые алгоритмы компиляции списка.вывод
Создано с использованием одноядерного компьютера с частотой 2 ГГц и 2 ГБ ОЗУ, работающего под управлением Python 2.6.6, в Debian Linux (с фоном Firefox).
Эти цифры являются лишь приблизительным ориентиром, поскольку фактическая скорость различных алгоритмов по-разному зависит от доли элементов, которые находятся в обоих исходных списках.
источник
Должен работать как сон. И, если вы можете, используйте наборы вместо списков, чтобы избежать всего этого изменения типа!
источник
Функциональный способ может быть достигнут с помощью
filter
иlambda
оператора.Редактировать: он отфильтровывает x, который существует как в list1, так и в списке, также можно установить разницу, используя:
Edit2: python3
filter
возвращает объект фильтра, инкапсулируя его,list
возвращает список вывода.источник
list(filter(lambda x:x in list1, list2))
чтобы получить его в виде списка.Это пример, когда вам нужно. Каждый элемент в результате должен появляться столько раз, сколько он показывает в обоих массивах.
источник
Возможно, уже поздно, но я просто подумал, что должен поделиться тем случаем, когда вы должны сделать это вручную (покажите работающий - ха-ха) ИЛИ когда вам нужно, чтобы все элементы появлялись как можно больше раз, или когда вам нужно, чтобы он был уникальным ,
Пожалуйста, обратите внимание, что тесты также были написаны для него.
источник
Если под логическим И вы подразумеваете элементы, которые появляются в обоих списках, например, пересечение, то вам следует рассмотреть Python
set
иfrozenset
типы.источник
Вы также можете использовать счетчик! Он не сохраняет порядок, но учитывает дубликаты:
источник