Slicing a dictionary by keys that start with a certain string

42,763

Solution 1

How about this:

in python 2.x :

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

In python 3.x :

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

Solution 2

In functional style:

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

Solution 3

In Python 3 use items() instead:

def slicedict(d, s):
    return {k:v for k,v in d.items() if k.startswith(s)}
Share:
42,763
Aphex
Author by

Aphex

Updated on July 09, 2022

Comments

  • Aphex
    Aphex almost 2 years

    This is pretty simple but I'd love a pretty, pythonic way of doing it. Basically, given a dictionary, return the subdictionary that contains only those keys that start with a certain string.

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

    This is fairly simple to do with a function:

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

    But surely there is a nicer, cleverer, more readable solution? Could a generator help here? (I never have enough opportunities to use those).

  • Ignacio Vazquez-Abrams
    Ignacio Vazquez-Abrams over 13 years
    Don't shadow the slice built-in (even though almost no one uses it).
  • Aphex
    Aphex over 13 years
    That dict comprehension is delicious. And I had no idea slice was a builtin, wtf?
  • Glenn Maynard
    Glenn Maynard over 13 years
    @Ignacio: When you're in a tiny, local function, it really isn't always worth worrying about stepping on builtins--there are too many of them, with far too common names. Better just to worry about it for nontrivial functions (if that) and globals. Builtins aren't keywords, after all.
  • Glenn Maynard
    Glenn Maynard over 13 years
    In Python, functional style is usually just what you don't want.
  • razpeitia
    razpeitia over 13 years
    No dictionary comprehension way dict((k, v) for k,v in d.iteritems() if k.startswith(s))
  • Karl Knechtel
    Karl Knechtel over 13 years
    Eh? The dict-comprehension approach certainly falls under my definition of "functional style".
  • cowbert
    cowbert almost 7 years
    in 2017: python can comprehension a dict purely using in: {k:d[k] for k in d if k.startswith(s)}, no more need to invoke a function call.