Как узнать, находятся ли элементы в одном списке в другом?

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

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]] B = [12, 5] 

Я пытаюсь выяснить, какие списки в A содержат элементы в B (порядок не имеет значения) и избавиться от остальных списков.

В этом случае ответы:

 [[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]] 

Если мы изменим B и сделаем это B = [13] , ответ будет:

 [[2, 5, 13, 14], [2, 5, 12, 13]] 

2 Solutions collect form web for “Как узнать, находятся ли элементы в одном списке в другом?”

Вы можете использовать set.issubset со списком, используя A[:] изменит исходный / список объектов A:

 A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]] B = [12, 5] st = set(B) A [:] = [sub for sub in A if st.issubset(sub)] print(A) [[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]] 

То же самое для B = [13]

 A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]] B = [13] st = set(B) A [:] = [sub for sub in A if st.issubset(sub)] print(A) [[2, 5, 13, 14], [2, 5, 12, 13]] 

задавать объекты

s.issubset (t) s <= t проверить, каждый ли элемент s в t

Для очень больших A или если у вас есть ограничения по памяти, вы можете использовать выражение генератора:

 A [:] = (sub for sub in A if st.issubset(sub)) 

Если порядок никогда не имеет значения, и можно установить, я бы предложил вам использовать их с самого начала. Выполнение поиска на наборах будет намного более эффективным.

Некоторые тайминги на немного больше A:

 In [23]: A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]] In [24]: B = [12, 5] In [25]: timeit filter(lambda x: all(y in x for y in B), A) 100000 loops, best of 3: 9.45 µs per loop In [26]: %%timeit st = set(B) [sub for sub in A if st.issubset(sub)] ....: 100000 loops, best of 3: 3.88 µs per loop map(lambda x: not B_set-set(x), A) In [27]: %%timeit ....: B_set = set(B) ....: map(lambda x: not B_set-set(x), A) ....: 100000 loops, best of 3: 6.95 µs per loop 

Если у вас уже есть элементы, хранящиеся в наборах в A:

 In [33]: %%timeit st = set(B) [sub for sub in A if sub >= st] ....: 1000000 loops, best of 3: 1.12 µs per loop 

Вы можете использовать filter в сочетании со all здесь:

 print filter(lambda x: all(y in x for y in B), A) 

Немного более эффективный ответ:

 B_set = set(B) print map(lambda x: not B_set-set(x), A) 
  • Покер ручная строка
  • Можно ли получить список ключевых слов в Python?
  • Могу ли я создать 32-разрядную программу cx_freeze, если у меня 64-разрядная ОС?
  • Подсчет количества вхождений в списке кортежей
  • Индекс Python вне диапазона в разрезе списка
  • совпадение списка в python: получить индексы под-списка в большем списке
  • Разделение списка словарей в подсписках после появления конкретного ключа словаря
  • Управление форматом печати при печати списка в Python
  • Python - лучший язык программирования в мире.