ОБНОВЛЕНИЕ
Спасибо за напоминание UltraInstinct и Mankind_008 , более упрощенный и внутренний ответ рассматривается ниже:
lst = [{"qty": 12}, {"qty": 12}, {"qty": 12}, {"qty": 12}, {"qty": 12}, {"qty": 12}, {"fail": 0, "pass": 12},
{"fail": 0, "pass": 12}, {"fail": 1}, {"pass": 11}, {"fail": 1}, {"pass": 11}, {"fail": 1}, {"pass": 11},
{"fail": 2}, {"pass": 10}]
# separate dictionaries with different keys
# dictionaries containing both "fail" and "pass" keys will be split
# and fitted into "fail_group" and "pass_group" respectively
qty_group = ({key: _} for dic in lst for key, _ in dic.items() if key == "qty")
fail_group = ({key: _} for dic in lst for key, _ in dic.items() if key == "fail")
pass_group = ({key: _} for dic in lst for key, _ in dic.items() if key == "pass")
# merge dictionaries with keys "qty", "fail" and "pass" item-wisely.
# and print result
print(list({**x, **y, **z} for (x, y, z) in zip(qty_group, fail_group, pass_group)))
Обратите внимание, что {**x, **y, **z}
работает только на python> = 3.5, который был введен в PEP 448 . Для python 2 или python <3.5 вы должны определить свою пользовательскую функцию, чтобы она делала то же самое, что и <code>{**x, **y, **z} (подробности обсуждаются в этой теме ):
def merge_three_dicts(x, y, z):
m = x.copy()
n = y.copy()
z.update(x)
z.update(y)
return z
Таким образом, в этом сценарии последняя строка кода должна быть:
print(list(merge_three_dicts(x, y, z) for (x, y, z) in zip(qty_group, fail_group, pass_group)))
Оба вышеупомянутых метода дадут вам результат:
[{'qty': 12, 'fail': 0, 'pass': 12}, {'qty': 12, 'fail': 0, 'pass': 12}, {'qty': 12, 'fail': 1, 'pass': 11}, {'qty': 12, 'fail': 1, 'pass': 11}, {'qty': 12, 'fail': 1, 'pass': 11}, {'qty': 12, 'fail': 2, 'pass': 10}]