如何按排序顺序对列表中的项目进行分组?

Son*_*ter 3 python grouping tuples list

我有一些列表,包括这样的元组

one = [(4, 'a'), (3, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (6, 'f')]
Run Code Online (Sandbox Code Playgroud)

我想基于该整数对列表1上的项目进行分组,以创建具有这样的输出的新数组

final = [(g1, 2, ['c']), (g2, 3, ['b','d']), (g3, 4, ['a']), (g4, 5, ['e']), (g5, 6, ['f'])]
Run Code Online (Sandbox Code Playgroud)

我不知道在创建最终列表.python是如何做到的?任何想法,将不胜感激.谢谢.

注意: g1,g2等只是一些带增量的字符串.

the*_*eye 7

由于您希望对输出进行排序,因此可以根据第一个元素对原始列表进行排序

>>> first = lambda x: x[0]
>>> one_sorted = sorted(one, key=first)
Run Code Online (Sandbox Code Playgroud)

那么你可以根据第一个元素对元素进行分组itertools.groupby,就像这样

groupby(one_sorted, first)
Run Code Online (Sandbox Code Playgroud)

因为你想按升序将数字分配给组,你可以enumerate像这样包装它

enumerate(groupby(one_sorted, first), 1)
Run Code Online (Sandbox Code Playgroud)

那么你可以在循环中解压缩结果,就像这样enumeratefor

for index, (item, group) in enumerate(groupby(one_sorted, first), 1)
Run Code Online (Sandbox Code Playgroud)

现在你只需要构造结果列表.你可以使用list comprehension来做到这一点,就像这样

>>> from itertools import groupby
>>> [(index, item, [j[1] for j in group])
...     for index, (item, group) in enumerate(groupby(one_sorted, first), 1)]
[(1, 2, ['c']), (2, 3, ['b', 'd']), (3, 4, ['a']), (4, 5, ['e']), (5, 6, ['f'])]
Run Code Online (Sandbox Code Playgroud)

[j[1] for j in group] 实际上迭代分组的项目并获取第二个项目,即实际的字符串.


或者,您可以将字符中的元素分组,如下所示

>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
Run Code Online (Sandbox Code Playgroud)

然后返回应用enumerate排序字典,就像这样

>>> [(index, number, groups[number])
...     for index, number in enumerate(sorted(groups), 1)]
[(1, 2, ['c']), (2, 3, ['b', 'd']), (3, 4, ['a']), (4, 5, ['e']), (5, 6, ['f'])]
Run Code Online (Sandbox Code Playgroud)