python中元组的分组列表

python中元组的分组列表,python,list,grouping,itertools,Python,List,Grouping,Itertools,我有一个由元组组成的列表,我已经根据第二项对这个列表进行了排序。然后我想把我的名单分组 基于第二项,将第一项放入列表 这是我的意见: [('aaa', 1), ('bbb', 1), ('ccc', 2), ('ddd', 2), ('eee', 3)] 我需要的是: [(g1, 1, ['aaa', 'bbb']), (g2, 2, ['ccc', 'ddd']), (g3, 1, ['eee'])] 每个元组的第一项是一个id(增量)。第二项是按分组分组的项数,第三项是分组元组列表。 如

我有一个由元组组成的列表,我已经根据第二项对这个列表进行了排序。然后我想把我的名单分组 基于第二项,将第一项放入列表

这是我的意见:

[('aaa', 1), ('bbb', 1), ('ccc', 2), ('ddd', 2), ('eee', 3)]
我需要的是:

[(g1, 1, ['aaa', 'bbb']), (g2, 2, ['ccc', 'ddd']), (g3, 1, ['eee'])]
每个元组的第一项是一个id(增量)。第二项是按分组分组的项数,第三项是分组元组列表。
如何在python中实现此输入?已经尝试使用itertools,但仍然一无所获。任何帮助都将不胜感激。

如果您知道如何使用
集合
模块,它将很容易解决此问题

In [5]: L = [('aaa', 1), ('bbb', 1), ('ccc', 2), ('ddd', 2), ('eee', 3)]

In [6]: for key, group in itertools.groupby(L, operator.itemgetter(1)):
   ...:     print(key, list(group))
   ...:     
1 [('aaa', 1), ('bbb', 1)]
2 [('ccc', 2), ('ddd', 2)]
3 [('eee', 3)]

In [7]: answer = []

In [8]: for k,group in itertools.groupby(L, operator.itemgetter(1)):
   ...:     answer.append((k, [g[0] for g in group]))
   ...:     

In [9]: answer
Out[9]: [(1, ['aaa', 'bbb']), (2, ['ccc', 'ddd']), (3, ['eee'])]
from collections import defaultdict

a = [('aaa', 1), ('bbb', 1), ('ccc', 2), ('ddd', 2), ('eee', 3)]

d = defaultdict(list)
for k, v in a:   
    d[v].append(k)

print d.items()
# [(1, ['aaa', 'bbb']), (2, ['ccc', 'ddd']), (3, ['eee'])]

一种方法是分步骤进行:

>>> grouped = enumerate(groupby(seq, key=lambda x: x[1]), 1)
>>> extracted = ((i, [g[0] for g in gg]) for i, (k,gg) in grouped)
>>> final = [(i, len(x), x) for i,x in extracted]
>>> final
[(1, 2, ['aaa', 'bbb']), (2, 2, ['ccc', 'ddd']), (3, 1, ['eee'])]
但即使每一行本身都有意义,我认为很难看出它实际上在做什么。使用生成器功能使一切变得更加清晰:

def grouper(elems):
    grouped = groupby(elems, key=lambda x: x[1])
    for i, (k, group) in enumerate(grouped, 1):
        vals = [g[0] for g in group]
        yield i, len(vals), vals

>> list(grouper(seq))
[(1, 2, ['aaa', 'bbb']), (2, 2, ['ccc', 'ddd']), (3, 1, ['eee'])]

(这里我任意使用了一个从1开始的索引来表示g1/g2/g3;很容易用
yield'g{}.format(I)
或其他什么来代替它。)

什么是g1、g2、g3?这是个变量?是的,它只是个变量。这可能是我创造的吗?或者只使用整数作为id?您不提供变量定义。我不知道我该怎么办。