使用itertools groupby创建列表列表

时间:2016-06-16 06:39:47

标签: python list itertools

我以[{1}}格式获取了一个项目列表,例如parent.id_child.id。我尝试按父ID对孩子的id进行分组,例如: 从输入1_2我需要输出['1_2', '2_2', '1_1', '2_1', '1_3']。 我试过这个:

[['1','2','3'], ['1','2']]

这正确地对元素进行分组,因为我只需要获得每个项目的第二个元素。我怎样才能做到这一点?另外,我可以在单个列表理解句中完成整个事情吗?

1 个答案:

答案 0 :(得分:2)

使用列表理解,是的;值本身将被传递到每个组迭代器中,因此您需要再次选择:

final = [[g[1] for g in group] for key, group in itertools.groupby(outputlist, lambda x: x[0])]

你可以通过将分割嵌套到groupby调用中来完成单个表达式中的所有操作,但即使分割成多行,这也会变得相当丑陋:

final = [
    [g[1] for g in group]
    for key, group in itertools.groupby(
        sorted(item.split('_') for item in inputlist),
        lambda x: x[0])]

您可以避免对整个输入列表进行排序,并仅使用字典对较小的组进行排序以进行分组。根据您的ID的大小,您可能还想对数据数字进行排序(因为文本排序是按字典顺序完成的):

per_parent = {}
for item in inputlist:
    parent, child = item.split('_', 1)
    per_parent.setdefault(parent, []).append(child)
final = [children for parent, children in sorted(
    per_parent.items(), key=lambda pc: int(pc[0]))]

在Python 2中,使用iteritems()而不是items()来避免构建中间列表。