2010-12-30 22 views
37

Bu oldukça basit bir işlemdir ancak bunu yapmanın güzel, pythonik bir yolunu seviyorum. Temel olarak, bir sözlük verildiğinde, yalnızca belirli bir dizeyle başlayan anahtarları içeren alt dizgiyi döndür.Belirli bir dizeyle başlayan anahtarlarla sözlüğü kesme

» d = {'Apple': 1, 'Banana': 9, 'Carrot': 6, 'Baboon': 3, 'Duck': 8, 'Baby': 2} 
» print slice(d, 'Ba') 
{'Banana': 9, 'Baby': 2, 'Baboon': 3} 

Bu bir fonksiyonu ile yapmak oldukça basittir:

def slice(sourcedict, string): 
    newdict = {} 
    for key in sourcedict.keys(): 
     if key.startswith(string): 
      newdict[key] = sourcedict[key] 
    return newdict 

Fakat elbette daha güzel, zeki, daha okunabilir bir çözüm var mı? Bir jeneratör burada yardımcı olabilir mi? (Bunları kullanmak için asla yeterli fırsatım yok).

+0

belirsiz piton kodunu Yapma. Python'un tüm fikri okunabilirliktir. Sadece belirsiz güce ihtiyacınız varsa Perl kullanın. – user3181121

+0

Ayrıca bkz. Http://pythoncentral.io/how-to-slice-custom-objects-classes-in-python/, '__getitem__' öğesini kendi türünüzdeki/alt sınıfın altından özelleştirebilirsiniz. – bjd2385

cevap

68

nasıl bu konuda: piton 2.x

:

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
+3

"Dilimi" yerleşik olarak gölgelemeyin (neredeyse hiç kimse kullanmasa da). –

+0

Bu dict anlayışı lezzetlidir. Ve hiç bir fikrim yoktu 'dilim 'bir yerleşik, wtf? – Aphex

+3

@Ignacio: Küçük, yerel bir işlevdeyken, aslında her zaman yerleşiklere adım atmaktan endişelenmenize gerek yok - çok fazla sayıda, çok yaygın isimler var. Daha iyi olmayan fonksiyonlar (eğer) ve globals için endişelenmeniz daha iyidir. Builtins, anahtar kelimeler değildir. –

9

fonksiyonel tarzı:

dict(filter(lambda item: item[0].startswith(string),sourcedict.iteritems()))

+8

Python'da, işlevsel stili genellikle istemediğiniz şeydir. –

+13

Eh? Düşkün anlama yaklaşımı kesinlikle "işlevsel stil" tanımımın altına düşüyor. –

3
piton 3.x içinde

def slicedict(d, s): 
    return {k:v for k,v in d.iteritems() if k.startswith(s)} 

In 0 yerinekullanım items(): Mümkünse sırf

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
İlgili konular