如何将此循环转换为列表理解?

How to convert this loops into list comprehension?

我想将这些循环转换为列表理解,但我不知道该怎么做。谁能帮帮我吗?

这是我要转换的列表:

students = ['Tommy', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 
            'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha','Victor', 
            'Samuel', 'Olivia', 'Tony']

assignment = [2, 5, 5, 7, 1, 5, 2, 7, 5, 1, 1, 1, 2, 1, 5, 2, 7, 2, 7]

x = list(zip(students, assignment))
Output = {}
for ke, y in x:
    y = "Group {}".format(y)
    if y in Output:
        Output[y].append((ke))
    else: 
        Output[y] = [(ke)] 
print(Output)

这是我尝试过的:

{Output[y].append((ke)) if y in Output else Output[y]=[(ke)]for ke, y in x}

你可以用嵌套的 dictionary/list 理解来做到这一点:

Output = { f'Group {group}' : [ name for name, g in x if g == group ] for group in set(assignment) }

输出:

{
  'Group 2': ['Tommy', 'Nancy', 'Nikhil', 'Victor', 'Olivia'],
  'Group 5': ['Kitty', 'Jessie', 'Darwing', 'Peter', 'Astha'],
  'Group 7': ['Chester', 'Sue', 'Samuel', 'Tony'],
  'Group 1': ['Curie', 'Andrew', 'Karren', 'Charles', 'Justin']
}
data1 = {'students': ['Tommy', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 
        'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha','Victor', 
        'Samuel', 'Olivia', 'Tony'], 
     'assignment': [2, 5, 5, 7, 1, 5, 2, 7, 5, 1, 1, 1, 2, 1, 5, 2, 7, 2, 7]}

df1 = pd.DataFrame(data1)

df1.groupby('assignment')['students'].agg(set).to_dict()

输出

{1: {'Andrew', 'Charles', 'Curie', 'Justin', 'Karren'},
 2: {'Nancy', 'Nikhil', 'Olivia', 'Tommy', 'Victor'},
 5: {'Astha', 'Darwing', 'Jessie', 'Kitty', 'Peter'},
 7: {'Chester', 'Samuel', 'Sue', 'Tony'}}

您想要一个 dict 理解,它会创建一个 dict,其值来自 list 理解。

itertools.groupby 可以帮助:

from itertools import groupby
x = sorted(list(zip(assignment, students)))
out = {f'Group {x}':[z[1] for z in y] for x,y in groupby(x, lambda y:y[0])}

{'Group 1': ['Andrew', 'Charles', 'Curie', 'Justin', 'Karren'], 'Group 2': ['Nancy', 'Nikhil', 'Olivia', 'Tommy', 'Victor'], 'Group 5': ['Astha', 'Darwing', 'Jessie', 'Kitty', 'Peter'], 'Group 7': ['Chester', 'Samuel', 'Sue', 'Tony']}