Python 列表为字典的值,每个列表中有多个值

Python 列表为字典的值,每个列表中有多个值,python,dictionary,string-formatting,dictionary-comprehension,keyvaluepair,Python,Dictionary,String Formatting,Dictionary Comprehension,Keyvaluepair,我正在尝试使用Python解决以下问题: 鉴于以下学生名单: students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha'] 我需要把学生分成三组。每个学生的组标识由名为assignment的列表中相同索引位置的整数指定: assignment = [2

我正在尝试使用Python解决以下问题:

鉴于以下学生名单:

students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']
我需要把学生分成三组。每个学生的组标识由名为assignment的列表中相同索引位置的整数指定:

assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
使用理解,我需要生成字典,以组号为键,以属于该组的学生列表为值,即预期输出如下:

{'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'],
 'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'],
 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}
我的第一步是将两个列表压缩到一起,以生成元组列表:

zip(students,assignment)
我生成了一个空字典来存储组成员身份:
cdict={}

我的逻辑是:检查每个元组中的整数(组号)。如果字典键中不存在该号码,请创建一个新号码,并添加与该组号对应的名称。如果存在,则将该值添加到字典中的值列表中

我想出了以下代码:

groupdict = {'Group{}'.format(group):[name] for name,group in zip(students,assignment) if group not in groupdict.keys()}
但是,它给了我以下结果:

{'Group 2': ['Astha'], 'Group 3': ['Nikhil'], 'Group 1': ['Charles']}
我试图将else语句包括在内:

groupdict = {'Group{}'.format(group):[name] for name,group in zip(students,assignment) if group not in groupdict.keys() else groupdict[group].append(name)} 
但它给了我一个语法错误

我应该如何修改我的理解代码以存储一个值列表,而不仅仅是最新的值?除了使用
setdefault()
函数或导入库之外,还有其他方法可以完成此操作吗?我只希望在我的代码中包含
for
if
else
zip()

提前感谢您的帮助!:)

使用
dict.setdefault

Ex:

students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']
assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
result = {}
for k,v in zip(students,assignment):
    result.setdefault(f"Group {v}", []).append(k)
{'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'],
 'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'],
 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}
输出:

students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']
assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
result = {}
for k,v in zip(students,assignment):
    result.setdefault(f"Group {v}", []).append(k)
{'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'],
 'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'],
 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}

另一个解决方案是,如果你想通过听写理解(包括使用
itertools.groupby
和排序(Rakesh的答案在这方面更有效)):

印刷品:

{'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'], 
 'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'], 
 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}
使用defaultdict

from collections import defaultdict
result = defaultdict(list)
students = [
    'Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue',
    'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha'
]
assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
for k, v in zip(students, assignment):
    result[f"Group {v}"].append(k)
print(result)
输出

defaultdict(<class 'list'>, {'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'], 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil'], 'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles']})
defaultdict(,{'group2':['Tom','Darwing','Karren','Justin','Astha','group3':['Kitty','Jessie','Curie','Nancy','Nikhil'],'group1':['Chester','Sue','Peter','Andrew','Charles'])

感谢Rakesh的及时回复!有没有办法在不使用.setdefault()的情况下生成相同的输出?效率不高。您将需要执行不需要的嵌套重复迭代谢谢您的回答。我想知道是否有一种方法在理解中不使用groupby()。我不应该在我的家庭作业中导入任何内容…:/可能我需要一个嵌套的迭代,但我在编写它时遇到了困难。