在列表内创建按字母顺序排序的嵌套列表

3

我有一个任务,需要按照学生的姓氏将他们分类到嵌套列表中。

new_group=[] # new, unnested group
for x in groups:
    for pupil in x:
        new_group.append(pupil)  #this adds every student to the unnested group

def sort(groups):
    new_group= sorted(new_group, key= lambda x: x.split(" ")[1])

我已将组的嵌套解除并按字母顺序排序,现在我必须将它们放回到嵌套列表中。如果我的列表看起来像:new_group = ["James Allen", "Ricky Andrew", "Martin Brooks", "Andre Bryant"],我可以将其转换为:[["James Allen", "Ricky Andrew"], ["Martin Brooks", "Andre Bryant"]]

所以,为了澄清,您的问题是如何将名称嵌套到[[James Allen],[Ricky Andrew],[Martin Brooks],[Andre Bryant]]中? - Enthus3d
原始的分组是基于什么的? - tzaman
我不确定我理解整个“嵌套”的部分。请提供一个xgroups的例子,并解释为什么您想按字母顺序对所有学生进行排序,而不是逐个单独对每个小组进行排序。最终,您的结果将是使每个组按字母顺序排序,例如[弗兰克,玛丽],[阿尔伯特,卡尔,卡尔]等... - Daemon Painter
原始组是: - Luca Marinescu
oh its too long to post - Luca Marinescu
我需要按照人们的姓氏将其分成26组进行排序。每个组对应字母表中的一个字母,因此姓氏以A开头的人将在第1组中,以B开头的人将在第2组中,依此类推。 - Luca Marinescu
1个回答

1
你可以使用itertools.groupby来实现嵌套:
from itertools import groupby

def last_name(name):
    return name.split()[-1] # Also works for middle names

def last_initial(name):
    return last_name(name)[0] # First letter of last name

groups = [['Martin Brooks'], ['Ricky Andrew'], ['Andre Bryant'], ['James Allen']]
sorted_pupils = sorted((pupil for g in groups for pupil in g), key=last_name)
grouped_pupils = [list(g) for _, g in groupby(sorted_pupils, key=last_initial)]
print(grouped_pupils)
# Produces [['James Allen', 'Ricky Andrew'], ['Martin Brooks', 'Andre Bryant']]

@LucaMarinescu,“grouped_pupils”不可能是一个组,除非他们所有人都有相同的姓氏首字母。它在您提供的测试数据中运行良好;也许可以展示一下您实际使用的数据? - tzaman
问题是我需要将它放在以“groups”为参数的函数内部,而且代码返回一个组。如果我删除函数,它就可以工作,所以基本上我有:def group_by_26(groups): 然后你的代码在函数内部。 - Luca Marinescu
我会发布名单,但它有600个名字那么长。 - Luca Marinescu
如果我想按照他们的名字来排序,应该怎么做?如果我想定义一个函数 first_name 来实现这个功能,应该怎么写?我尝试了 def first_name(name): return name.split[1] - Luca Marinescu
@LucaMarinescu 你需要分割的第一个组件,所以代码如下:def first_name(name): return name.split()[0] 然后对于组键:def first_initial(name): return first_name(name)[0] - tzaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接