Python · collections

Dictionaries Basics

Store values under names (keys) and look them up instantly.

Creating dictionaries


          # create dict
          person = {"name": "Alice", "age": 25}
          empty = {}
          scores = {"math": 90, "english": 85}
        

Each entry is a key: value pair; keys are unique.

Accessing values


          # access by key
          person = {"name": "Alice", "age": 25}
          person["name"]
          # ans: "Alice"
          person["age"]
          # ans: 25
        

How a dict finds a key so fast

hash(key) % 8 → ?

A simplified picture: the key's hash picks a slot, so Python jumps straight there instead of searching every entry.

The get method


          # get with default
          person = {"name": "Alice"}
          person.get("age")
          # ans: None
          person.get("age", 0)
          # ans: 0
        

Adding and updating


          # add new key
          person = {"name": "Alice"}
          person["age"] = 25
          # ans: {"name": "Alice", "age": 25}
          # update existing
          person["age"] = 26
          # ans: {"name": "Alice", "age": 26}
        

The same syntax adds a key that is missing and replaces the value of a key that exists.

Deleting items


          # delete key
          person = {"name": "Alice", "age": 25}
          del person["age"]
          # ans: {"name": "Alice"}
        

Keys, values, items


          # get keys, values, items
          person = {"name": "Alice", "age": 25}
          person.keys()
          # ans: dict_keys(['name', 'age'])
          person.values()
          # ans: dict_values(['Alice', 25])
          person.items()
          # ans: dict_items([('name', 'Alice'), ('age', 25)])
        

Exercises

Predict the result, then reveal it.

Exercise 1


        # what is the value?
        d = {"a": 1, "b": 2}
        d["a"]
        # ans: 1
      

Exercise 2


        # key not found?
        d = {"a": 1}
        d["b"]
        # ans: KeyError
      

Exercise 3


        # get vs brackets?
        d = {"a": 1}
        d.get("b")
        # ans: None
        d["b"]
        # ans: KeyError
      

Exercise 4


        # adding new key?
        d = {"a": 1}
        d["b"] = 2
        # ans: {"a": 1, "b": 2}
      

Exercise 5


        # updating value?
        d = {"a": 1}
        d["a"] = 10
        # ans: {"a": 10}
      

Exercise 6


        # membership test?
        d = {"a": 1, "b": 2}
        "a" in d
        # ans: True
        1 in d
        # ans: False (checks keys, not values)
      

Exercise 7


        # dict length?
        d = {"a": 1, "b": 2, "c": 3}
        len(d)
        # ans: 3
      

Exercise 8


        # empty dict check?
        d = {}
        bool(d)
        # ans: False
      

Exercise 9


        # nested dict?
        d = {"user": {"name": "Alice", "age": 25}}
        d["user"]["name"]
        # ans: "Alice"
      

Exercise 10


        # dict from pairs?
        pairs = [("a", 1), ("b", 2)]
        d = dict(pairs)
        # ans: {"a": 1, "b": 2}
      

Remember

d[key]

Reads a value; a missing key raises KeyError.

d.get(key, default)

Never raises: returns the default, or None.

d[key] = value

Adds a new key or replaces an existing value. del d[key] removes it.

in and len

Both look at keys, not values. An empty dict is falsy.