Вы можете попробовать этот однострочник:
d1=[{'type':'vehicle','name':'car'},{'type':'fruit','name':'apple'},{'type':'fruit','name':'orange'},{'type':'vehicle','name':'bike'}]
res = {
k: [d.get('name') for d in d1 if k in d.values()]
for k in set(list(map(lambda x: x['type'],d1)))
}
print(res)
Или, может быть, вы можете попробовать этот «двухстрочный»:
d1=[{'type':'fruit','name':'apple'},{'type':'fruit','name':'orange'},{'type':'vehicle','name':'car'},{'type':'vehicle','name':'bike'}]
temp=[{d['type']:d['name']} for d in d1]
res = {k: list(filter(None,[d.get(k) for d in temp]))
for k in set().union(*temp)
}
print(res)
Второе решение основано на ответе Алекса Холла .
Выходы:
{'vehicle': ['car', 'bike'], 'fruit': ['apple', 'orange']}