2010-12-30 11 views
37

Jest to bardzo proste, ale chciałbym mieć ładny, pytonowy sposób robienia tego. Zasadniczo, biorąc pod uwagę słownik, zwróć subdictionary, który zawiera tylko te klucze, które zaczynają się od określonego ciągu.Krojenie słownika za pomocą klawiszy rozpoczynających się od określonego ciągu znaków

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

Jest to dość proste do zrobienia z funkcją:

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

Ale na pewno nie jest ładniejszy, mądrzejszy, bardziej czytelne rozwiązanie? Czy generator może tu pomóc? (Nigdy nie miałem dość okazji, aby z nich skorzystać).

+0

nie Czy niejasne kodu Pythona tylko dlatego, że jest to możliwe. Cała idea Pythona to czytelność. Jeśli potrzebujesz słabej mocy, użyj Perla. – user3181121

+0

Zobacz także http://pythoncentral.io/how-to-slice-custom-objects-classes-in-python/, możesz dostosować '__getitem__' w swoim własnym typie/podklasie dict. – bjd2385

Odpowiedz

68

Jak o tym:

w Pythonie 2.x:

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

w Pythonie 3.x:

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

Nie cienia wbudowanego "plasterka" (mimo że prawie nikt go nie używa). –

+0

To zrozumienie dict jest pyszne. I nie miałem pojęcia, że ​​"plasterek" był wbudowany, wtf? – Aphex

+3

@Ignacio: Kiedy jesteś w małej, lokalnej funkcji, naprawdę nie zawsze warto martwić się o wchodzenie na builtiny - jest ich zbyt wiele, o nazbyt nazbyt popularnych nazwach. Lepiej tylko martwić się o nie nietrywialne funkcje (jeśli tak) i globale. W końcu wbudowane nie są słowami kluczowymi. –

9

w stylu funkcjonalnym:

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

+8

W języku Python styl funkcjonalny jest zwykle tym, czego nie chcesz. –

+13

Eh? Podejście do rozumienia dyktatury z pewnością mieści się w mojej definicji "stylu funkcjonalnego". –

3

W Python 3 użycie items() zamiast:

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
Powiązane problemy