2015-04-19 17 views
9

Mam dwóch list:Jak sprawdzić, czy elementy z jednej listy znajdują się w innej?

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

Próbuję dowiedzieć się, które można znaleźć w A zawierają elementy B (kolejność nie ma znaczenia) i pozbyć się reszty list.

W tym przypadku odpowiedź brzmi:

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

Jeśli zmienimy B i sprawiają, że B = [13], odpowiedzią byłoby:

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

Odpowiedz

6

Można użyć set.issubset z listowego, używając A[:] zmieni obiekt oryginalny/listowy 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]] 

samo dla 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 (t) t = e < sprawdzenie, czy każdy element S jest w t

bardzo dużych A lub jeśli masz ograniczenia pamięci, możesz użyć wyrażenia generatora:

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

Jeśli zamówienie nigdy nie ma znaczenia i możliwe jest ustawienie, sugerowałbym, abyś używał ich od samego początku. Wykonywanie wyszukiwań na zestawach będzie o wiele bardziej wydajne.

Niektóre czasy na nieco większej 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 

Jeśli już elementy przechowywane jako zestawy w 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

Czy usuwane są odpowiedzi innych użytkowników? (nie moje) –

+0

@PedroLobito. Nie wiem o co ci chodzi? –

+0

wiele odpowiedzi usunięto z tej odpowiedzi. –

1

Można użyć filter w połączeniu z all tutaj:

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

Nieco bardziej skuteczna odpowiedź:

B_set = set(B) 
print map(lambda x: not B_set-set(x), A)