, , :
st = {'2', '4', '17', '21', '22', '24', '27', '28', '29', '33', '39'}
filtered_dict = {k: v for (k, v) in my_dict.iteritems() if not st.isdisjoint(v)}
, :
In [6]: st ={1,2,3}
In [7]: v = [1,4,5]
In [8]: st.isdisjoint(v)
Out[8]: False
In [11]: v = [7,4,5]
In [12]: st.isdisjoint(v)
Out[12]: True
:
st = {'2', '4', '17', '21', '22', '24', '27', '28', '29', '33', '39'}
filtered_dict = {k: v for (k, v) in my_dict.iteritems() if any(val in st for val in v)}
, any v , .
len(v) , mylist , x v O(len(my_list)) , k, v , .
dict , , :
In [22]: my_list = ['2', '4', '17', '21', '22', '24', '27', '28', '29', '33', '39']
In [23]: my_dict = {'217': {'586': 2.0, '578': 5.0, '172': 1.0, '1222': 1.0, '597': 4.0, '1303': 2.0, '195': 5.0},
....: '660': {'176': 4.0, '174': 3.0, '231': 5.0, '233': 4.0, '797': 4.0, '541': 3.0, '27': 1.0, '210': 4.0},
....: '661': {'2': 4.0, '4': 3.0, '29': 5.0, '17': 4.0, '39': 4.0, '541': 3.0, '27': 1.0, '210': 4.0}}
In [24]: print [(k,v) for k,v in my_dict.iteritems() for x in my_list if x in v]
[('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('661', {'541': 3.0, '39': 4.0, '2': 4.0, '4': 3.0, '17': 4.0, '210': 4.0, '27': 1.0, '29': 5.0}), ('660', {'797': 4.0, '27': 1.0, '541': 3.0, '210': 4.0, '176': 4.0, '174': 3.0, '231': 5.0, '233': 4.0})]
7 , , dict, len (my_list) x in v True. my_list .
my_list 1000 :
In [35]: len(my_list)
Out[35]: 1000
In [36]: %%timeit
....: st = set(my_list)
....: {k: v for (k, v) in my_dict.iteritems() if not st.isdisjoint(v)}
....:
10000 loops, best of 3: 21.9 µs per loop
In [37]: timeit {k:v for k,v in my_dict.iteritems() for x in my_list if x in v}
10000 loops, best of 3: 136 µs per loop
, , 100 :
In [40]: timeit {k: v for (k, v) in my_dict.iteritems() if not st.isdisjoint(v)}
1000000 loops, best of 3: 1.09 µs per loop