lst = [OrderedDict([('type', 'character'), ('letter', 'a')]), OrderedDict([
    ('type', 'character'), ('letter', 'b')]), OrderedDict([('type',
    'character'), ('letter', 'c')]), OrderedDict([('type', 'character'), (
    'letter', 'd')]), OrderedDict([('type', 'integer'), ('number', '1')]),
    OrderedDict([('type', 'integer'), ('number', '2')]), OrderedDict([(
    'type', 'integer'), ('number', '3')]), OrderedDict([('type', 'integer'),
    ('number', '4')])]
types_found = []
types_dict = {}
for entry in lst:
    t = entry.get('type', 'unknown')
if t not in types_dict:
    types_found.append(t)
types_dict[t] = OrderedDict([('type', t)])
for k, v in list(entry.items()):
    if k != 'type':
        types_dict[t].setdefault(k, []).append(v)
new_list = [types_dict[t] for t in types_found]
Объединение нескольких словарей на основе общего значения ключа в один словарь