2009-10-16 16 views
14

Aşağıdaki veri yapısı vardır:Sözlükler listesinde bir Python sözlük değeri aramanın en iyi yolu nedir?

data = [ 
     {'site': 'Stackoverflow', 'id': 1}, 
     {'site': 'Superuser', 'id': 2}, 
     {'site': 'Serverfault', 'id': 3} 
    ] 

Ben özel bir değere sahip herhangi bir site olup olmadığını görmek için yukarıdaki liste aramak istiyorsunuz. Örneğin, listenin site = 'Superuser' olan bir sözlük içerip içermediğini ve True/False değerini döndürüp döndürmediğini görmek için yukarıdakileri arayın. Yukarıda her bir öğenin üzerinde döngü yapmak ve bunları karşılaştırmak için yapabilirim. Bir aramaya ulaşmak için alternatif bir yol var mı?

+3

Veriler sıralanırsa en iyileştirmeler vardır. Değilse, sadece '' (') çözümünü kullanın. – Triptych

cevap

25
any(d['site'] == 'Superuser' for d in data) 
+9

Vay, birbirinden 10 saniye içinde * tam * aynı içeriği yayınladık. Sanırım benimkini sileceğim. :( – FogleBird

+1

, Thierry Lam'in tam olarak istemediği "her bir öğenin üstesinden gelmek ve onları karşılaştırmak" diye düşünür. – nosklo

+0

Bence normal bir 'for' döngüsü anlamına gelir. –

4

Listeler kesinlikle döngüler gerektirir. Listeler bunun için.

Döngüden kaçınmak için listelerden kaçınmalısınız.

Arama tuşları ve nesnelerin sözlüklerini istiyorsunuz.

sites = dict((d['site'],d) for d in data) 
ids = dict((d['id'],d] for d in data) 

Şimdi bunun yerine bir döngü oluşan bir karma aramasını kullanarak sites["Superuser"] ile 'Süper kullanıcı' ile ilişkili öğeyi bulabilirsiniz.

9
filter(lambda x: x['site']=='Superuser', data) 
1

Python sözdizimi emin değilim, ama böylesi sizin için işe yarayabilecek. Birincil veri yapınızı oluştururken, aynı zamanda, site adına yazılan bir karma veya ilişkilendirici dizi olan bir paralel yapı oluşturun; Belirli bir sitenin var olup olmadığını görmek için site adında karma arama yapmaya çalışırsınız. Eğer başarılı olursa, o site için veri yapınızda bir kayıt olduğunu biliyorsunuz ve bunu hash araması sırasında yapmışsınızdır (büyük olasılıkla O (1) veya O (log2 (n)) karma tekniğine bağlı olarak) list traversal O (n/2).

(yazarken güncellenir: Bu, S.Lott'un gönderdiği oldukça fazla)

İlgili konular