Here is a simple solution that I would recommend:
zipped_a = zip(*a)
keys = next(zipped_a)
dicts = [dict(zip(keys, values)) for values in zipped_a]
Another way to pull keys out of the a_zipped iterator is by using it in nested loops. The first iteration of the outer loop grabs the keys, while the inerloop grabs each set of values. Unfortunately, this approach is not obvious on first glance:
a_zipped = zip(*a)
dicts = [dict(zip(keys, values)) for keys in a_zipped for values in a_zipped]
And yet another way to pull out keys from zip(*a) is to use iterable unpacking. It's clear, but it does create an extra list (all_values):
keys, *all_values = zip(*a)
dicts = [dict(zip(keys, values)) for values in all_values]
An then there's this silly one-liner:
dicts = [dict(zip(k, v)) for k, *zv in [zip(*a)] for v in zv]
Original Answer:
Sometimes a multiline solution can be really straight forward:
# make an iterator for each list
iters = list(map(iter, a))
# pull off first item from each iterator to use as keys
keys = list(map(next, iters))
# zip the iterators so they are grouped as values,
# then zip keys and values to make tuples for dict constructor
dicts = [dict(zip(keys, values)) for values in zip(*iters)]