pythondictionarysetdefault

Use cases for the 'setdefault' dict method


The addition of collections.defaultdict in Python 2.5 greatly reduced the need for dict's setdefault method. This question is for our collective education:

  1. What is setdefault still useful for, today in Python 2.6/2.7?
  2. What popular use cases of setdefault were superseded with collections.defaultdict?

Solution

  • You could say defaultdict is useful for settings defaults before filling the dict and setdefault is useful for setting defaults while or after filling the dict.

    Probably the most common use case: Grouping items (in unsorted data, else use itertools.groupby)

    # really verbose
    new = {}
    for (key, value) in data:
        if key in new:
            new[key].append( value )
        else:
            new[key] = [value]
    
    
    # easy with setdefault
    new = {}
    for (key, value) in data:
        group = new.setdefault(key, []) # key might exist already
        group.append( value )
    
    
    # even simpler with defaultdict 
    from collections import defaultdict
    new = defaultdict(list)
    for (key, value) in data:
        new[key].append( value ) # all keys have a default already
    

    Sometimes you want to make sure that specific keys exist after creating a dict. defaultdict doesn't work in this case, because it only creates keys on explicit access. Think you use something HTTP-ish with many headers -- some are optional, but you want defaults for them:

    headers = parse_headers( msg ) # parse the message, get a dict
    # now add all the optional headers
    for headername, defaultvalue in optional_headers:
        headers.setdefault( headername, defaultvalue )