2013-08-06 1 views
2

의 두 목록을 비교 : 3126 어딘가에있는 경우, 예를 들어,파이썬 - 나는 두 개의 목록이 세트

list1 = [ 
    set(['3105']), 
    set(['3106', '3107']), 
    set(['3115']), 
    set(['3122']), 
    set(['3123', '3126', '286']) 
] 

나는이 목록의 교회법을 비교하려면 어떻게

list2 = [ 
    set(['400']), 
    set(['3115']), 
    set(['3100']), 
    set(['3107']), 
    set(['3123', '3126']) 
] 

를, 그래서 두 목록의 집합 중 하나라도 있으면 3126으로 다른 목록을 추가합니다. 최종 목표는 개별 목록을 추가 한 다음 목록의 길이를 사용하여 목록간에 일치하는 항목이 얼마나 많은지 알 수 있습니다.

답변

0

당신은 세트로 세트의 두 목록을 평평하게 할 수 있습니다

common = l1.intersection(l2) # common will give common elements 
print len(common) # this will give you the number of elements in common. 

결과 :

>>> print common 
set(['3123', '3115', '3107', '3126']) 
>>> len(common) 
4 
+0

'설정 (itertools.chain.from_iterable (목록 1 두 목록에서 세트의 조합을, 그 다음이 두 조합의 교차점을))'중첩 된 LC보다 빠르다. –

+0

정보 주셔서 감사합니다! – jh314

+1

감사합니다. –

2

당신은해야 할 것

l1 = set(s for x in list1 for s in x) 
l2 = set(s for x in list2 for s in x) 

그런 다음 교차로를 계산할 수 있습니다 모든 세트를 병합하십시오.

sets_intersection = reduce(set.union, list1) & reduce(set.union, list2) 

if 3126 in sets_intersection: 
    # .... 
1
>>> common_items = set().union(*list1) & set().union(*list2) 
>>> common_items 
set(['3123', '3115', '3107', '3126']) 
>>> '3126' in common_items 
True 

타이밍 비교 :

>>> %timeit reduce(set.union, list1) & reduce(set.union, list2) 
100000 loops, best of 3: 11.7 us per loop 
>>> %timeit set().union(*list1) & set().union(*list2)  #winner 
100000 loops, best of 3: 4.63 us per loop 
>>> %timeit set(s for x in list1 for s in x) & set(s for x in list2 for s in x) 
10000 loops, best of 3: 11.6 us per loop 
>>> %timeit import itertools;set(itertools.chain.from_iterable(list1)) & set(itertools.chain.from_iterable(list2)) 
100000 loops, best of 3: 9.91 us per loop