I can think of two ways, based on the same idiomatic way of grouping elements from a sequence:
import itertools as it
content = range(50)
keys = ('p', 'a', 'b', 'c', 'd')
dicts = [dict(zip(keys, gr)) for gr in zip(*[iter(content)]*len(keys))]
print(dicts)
dicts2 = [dict(pairs) for pairs in zip(*[iter(zip(it.cycle(keys), content))]*len(keys))]
print(dicts2)
produces
[{'p': 0, 'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'p': 5, 'a': 6, 'b': 7, 'c': 8, 'd': 9}, {'p': 10, 'a': 11, 'b': 12, 'c': 13, 'd': 14}, {'p': 15, 'a': 16, 'b': 17, 'c': 18, 'd': 19}, {'p': 20, 'a': 21, 'b': 22, 'c': 23, 'd': 24}, {'p': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29}, {'p': 30, 'a': 31, 'b': 32, 'c': 33, 'd': 34}, {'p': 35, 'a': 36, 'b': 37, 'c': 38, 'd': 39}, {'p': 40, 'a': 41, 'b': 42, 'c': 43, 'd': 44}, {'p': 45, 'a': 46, 'b': 47, 'c': 48, 'd': 49}]
[{'p': 0, 'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'p': 5, 'a': 6, 'b': 7, 'c': 8, 'd': 9}, {'p': 10, 'a': 11, 'b': 12, 'c': 13, 'd': 14}, {'p': 15, 'a': 16, 'b': 17, 'c': 18, 'd': 19}, {'p': 20, 'a': 21, 'b': 22, 'c': 23, 'd': 24}, {'p': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29}, {'p': 30, 'a': 31, 'b': 32, 'c': 33, 'd': 34}, {'p': 35, 'a': 36, 'b': 37, 'c': 38, 'd': 39}, {'p': 40, 'a': 41, 'b': 42, 'c': 43, 'd': 44}, {'p': 45, 'a': 46, 'b': 47, 'c': 48, 'd': 49}]
The first way creates each dictionary pairing the chunk it gets from the contents with the keys.
In terms of performance it takes
5.92 µs ± 42.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
The second way first pairs the contents with the keys by repeating the keys alongside them, then it takes chunks of such pairs and creates a dictionary from them.
It takes slightly less, at
5.76 µs ± 46.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Note: in case the number of the input elements is not a multiple of the number of keys, the first solution can be modified to accommodate a partial dictionary
dicts = [dict((k,v) for k,v in zip(keys, gr) if v is not None) for gr in it.zip_longest(*[iter(content)]*len(keys))]
I understand it's not easy to explain how the chunking works to somebody who has just started with Python.
As cited in the comments, please refer to this SO QA for further details