2015-12-01 4 views
4
a = [2,7,9] 
b = [[7,9],[1,2],[2,9]] 

Сколько пар в списке [a] соответствует PAIR кортежа [b] Обратите внимание, как пара [7,9] и [2,9] в списке [a]. Даже если пара [1,2] содержит цифру 2, она не подсчитывается, потому что обе цифры не указаны в списке [a]. Возвращаемое значение должно быть 2, len совпадающих пар.Число пар элементов в списке

len(filter(lambda l:if_in(b,l),a)) 

Нужна помощь в создании функции if_in или более простого способа записи этой функции в одном. Как я могу заставить эту функцию работать независимо от размера a или b.

ответ

6

Сделать a набор и использовать set.issuperset, проверяя, если a является superset каждого подсписка:

a = [2,7,9] 
b = [[7,9],[1,2],[2,9]] 


st = set(a) 

print(sum(st.issuperset(sub) for sub in b)) 
2 

Вы можете пойти двумя путями, либо сделать все наборы подсписков или выше просто сделать набор, когда а является надстройкой подсписка то подсписком является подмножеством:

In [6]: a = [2,7,9] 

In [7]: b = [[7,9],[1,2],[2,9]] 

In [8]: st = set(b[0]) 

In [9]: st.issubset(a) 
Out[9]: True 
In [10]: st = set(b[1]) 

In [11]: st.issubset(a) 
Out[11]: False 

In [13]: st = set(a) 

In [13]: st.issuperset(b[0]) 
Out[13]: True 

In [14]: st.issuperset(b[1]) 
Out[14]: False 

Очевидно, поскольку есть только несколько номеров в вашем списке больше смысла, чтобы сделать набор из а и использовать супернабор.

+0

Спасибо, работает отлично! – QuantumTraveler

+0

Не беспокойтесь, пожалуйста. –

0

Если вы хотите работать с подмножествами a, вы можете использовать itertools.combinations (iterable, r). Цитируя документы, возвращает r подпоследовательностей элементов из входного итерабельного.

from itertools import combinations 

a = [2, 7, 9] 
b = [(7, 9), (1, 2), (2, 9)] 
# combinations returns a collection of tuples 
# so changed your b items to tuples. 

len(filter(lambda x: x in b, combinations(a ,2)) 
+0

Это потребует возраста для большого ввода и потенциально может привести к ошибке памяти, –

Смежные вопросы