2015-04-19 2 views
9

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

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]] 

ответ

6

Вы можете использовать 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]] 

set objects

s.issubset (т) ы теста < = т, является ли каждый элемент х в т

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

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

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

Некоторые тайминги на несколько крупнее:

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 
+0

Устраняют ли другие пользователи ответы? (не мой) –

+0

@PedroLobito. Я не знаю, что вы имеете в виду? –

+0

много ответов, в которых удалено по этому вопросу. –

1

Вы можете использовать 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) 
Смежные вопросы