bir kullanabilir v anahtarlarında x x in v.keys()
kontrol eşittir denetler mylist elemanı in
iç sözlük v olup MyList ve çekler yineleme halinde değer kümesinden ayrık değilse çiftleri tutarak ayarlayın: paylaştıkları yoksa
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)}
onlar sadece ayrık olacak en az bir eleman:
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
v dan
any eleman kümesinde ise
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)}
biz elemanlarını tutmak Nerede:
O biraz eşdeğerdir.
En kötü durum biz mylist
elemanları yinelemek x v ise kontrol, sette karşı len(v)
elemanlarını kontrol her vaka için O(len(my_list))
ve aynı zamanda v bir maç olsun her zaman eşleştirme, aynı k yaratır.
bir listeye göre çiftleri daha maç tuşlarıyla bir dicti ekleyip eklerseniz, ne olacağını görebilirsiniz: 7 maçları vardır
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})]
Çünkü biz aynı eşleştirme yedi kez olsun, sen bir dict içinde dupes almazsınız ancak len (my_list) zamanlarını yinelemeniz ve x in v
Eşleşme zamanının eşleşme uzunluğunu oluşturmalısınız. My_list'in uzunluğu büyüdükçe çalışma süresi de buna göre artacaktır.
Sadece hatırı sayılır bir fark var 1000 öğe my_list yapma: Başlamadan bir dizi kullanırsanız hemen hepsi o zaman set oluşturulmasında harcanan
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
o ishal daha hızlı 100 kez:
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
Beklenen bazı çıktı değerlerini eklemelisiniz .. – msvalkon
'... eğer my_list [0] in v öğesinde ilk öğe v ise .. belki de yapmak istediğiniz şey ... öğe için my_list öğesinde v içinde? –