在Python中将元组列表分组到字典

bac*_*ood 2 python sorting grouping dictionary list

我想将列表转换为dict,如下所示:

somelist = [("facultyX", "memberA", "Student"),
            ("facultyX", "memberB", "Student"),
            ("facultyX","memberC", "Programmer"), 
            ("facultyY", "memberD", "Student"), 
            ("facultyY", "memberE","PostDoc")]

result = {'facultyX':{'Student':['memberA','memberB'],
                      'Programmer':['memberC']},
          'facultyY':{'Student':['memberD'],
                      'PostDoc':['memberE']}}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

稍微撒dict.setdefault()一点就不那么难了:

result = {}

for fac, member, role in yourlist:
    fac_data = result.setdefault(fac, {})
    fac_data.setdefault(role, []).append(member)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> somelist = [("facultyX", "memberA", "Student"),
...             ("facultyX", "memberB", "Student"),
...             ("facultyX","memberC", "Programmer"), 
...             ("facultyY", "memberD", "Student"), 
...             ("facultyY", "memberE","PostDoc")]
>>> result = {}
>>> for fac, member, role in somelist:
...     fac_data = result.setdefault(fac, {})
...     fac_data.setdefault(role, []).append(member)
... 
>>> from pprint import pprint
>>> pprint(result)
{'facultyX': {'Programmer': ['memberC'], 'Student': ['memberA', 'memberB']},
 'facultyY': {'PostDoc': ['memberE'], 'Student': ['memberD']}}
Run Code Online (Sandbox Code Playgroud)