2008-10-03 7 views
6

listeden içinden bir dict bir alt kümesini Çıkarma:yüzden genellikle böyle bir şey yapmak bir dict içinden bir listenin kavşak kaldırmak için, bu bir örnekle açıklamak gerçekten sadece kolay

a = {1:'', 2:'', 3:'', 4:''} 
exclusion = [3, 4, 5] 

# have to build up a new list or the iteration breaks 
toRemove = [] 
for var in a.iterkeys(): 
    if var in exclusion: 
     toRemove.append(var) 

for var in toRemove: 
    del a[var] 

Bu sıradışı bir örnek gibi görünebilir, ancak böyle bir şey yapmak zorunda olduğum zamanların sayısı şaşırtıcıdır. Bunu setlerle yapmak çok daha hoş olurdu, ama ben açıkça dict için 'değerlerini' korumak istiyorum.

Bu yöntem rahatsız edici çünkü iki döngü ve ek bir dizi gerektirir. Bunu yapmanın daha temiz ve daha verimli bir yolu var mı?

cevap

12

dict.pop düşünün: key anahtar olmadığında

for key in exclusion: 
    a.pop(key, None) 

None durum istisna gelen pop tutar.

+0

Bu benim cevabımdan çok daha iyi. – SpoonMeiser

+0

güzel ipucu, dict.pop unutuldu. – camflan

+0

None yerine herhangi bir değeri kullanabilirsiniz: silme = [d.pop (k, 0) 'in hariç tutulması için] – jfs

2

Neden iterkeys yerine keys yöntemini kullanmıyoruz? Böylelikle, bir döngüde bir liste döndürdüğü için bir döngüde yapabilirsiniz.

3
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion) 
+0

Bu çözüm, açık döngülerden sakınır, bu iyidir, ancak sözlüğü sıfırdan yeniden oluşturur, bu da kötüdür. Belki sözlükler setlerden bazı yöntemler çalmalıdır? –

+0

Döngüleri önlemek ve böylece C kodunda kalmaktan ne kadar faydalandığınızdan emin değilim. Sanırım her şey senin ne kadar büyük olduğu ve ne kadarının kaldırıldığına bağlı. Blair'in cevabının büyük dikmeler için daha verimli olacağını düşünüyorum ama emin olmak için test etmek zorundayım. –

+0

Komik, bir anahtardaki bir 200k dict (i [i] = i (200k) aralığında) anahtarlarının yarısını kaldırarak, makinemde, kopyalamayı kopyalamaktan sadece% 30 daha yavaştır. –

1

Hariç tutma listenizi bir kümeye dönüştürebilir, ardından çakışmayı elde etmek için yalnızca kavşağı kullanabilirsiniz.

exclusion = set([3, 4, 5]) 

for key in exclusion.intersection(a): 
    del a[key] 
İlgili konular