I like dict.setdefault()
for this sort of thing:
create a dataset to try (NOTE: much better to post a small dataset yourself
) borrowing from @komoto48g
In [38]: @dataclass
...: class Project():
...: type: str
...: value: None
...:
In [39]: y = [0, 1, 2, 3.0, 4.0, None, True, 'foo', (), [], type, lambda:y]
In [40]: projects = [Project(str(type(i)), i) for i in y]
Now your function:
In [41]: def getProjectTypesToListOfProjects(projects):
...: result = {}
...: for project in projects:
...: result.setdefault(project.type, []).append(project)
...: return result
...:
...:
And try it out
In [42]: getProjectTypesToListOfProjects(projects)
Out[42]:
{"<class 'int'>": [Project(type="<class 'int'>", value=0),
Project(type="<class 'int'>", value=1),
Project(type="<class 'int'>", value=2)],
"<class 'float'>": [Project(type="<class 'float'>", value=3.0),
Project(type="<class 'float'>", value=4.0)],
"<class 'NoneType'>": [Project(type="<class 'NoneType'>", value=None)],
"<class 'bool'>": [Project(type="<class 'bool'>", value=True)],
"<class 'str'>": [Project(type="<class 'str'>", value='foo')],
"<class 'tuple'>": [Project(type="<class 'tuple'>", value=())],
"<class 'list'>": [Project(type="<class 'list'>", value=[])],
"<class 'type'>": [Project(type="<class 'type'>", value=<class 'type'>)],
"<class 'function'>": [Project(type="<class 'function'>", value=<function <lambda> at 0x10543de10>)]}