web-dev-qa-db-fra.com

Découpage d'un dictionnaire par des clés commençant par une certaine chaîne

C'est assez simple mais j'adorerais une jolie façon Pythonique de le faire. Fondamentalement, étant donné un dictionnaire, renvoyez le sous-domaine qui contient uniquement les clés qui commencent par une certaine chaîne.

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

C'est assez simple à faire avec une fonction:

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

Mais il y a sûrement une solution plus agréable, plus intelligente et plus lisible? Un générateur pourrait-il aider ici? (Je n'ai jamais assez d'occasions de les utiliser).

39
Aphex

Que dis-tu de ça:

dans python 2.x:

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

Dans python 3.x:

def slicedict(d, s):
    return {k:v for k,v in d.items() if k.startswith(s)}
70
Mark Byers

Dans un style fonctionnel:

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

9
seriyPS

Dans Python utilisez plutôt items():

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