python中的itertools.groupby()

Posted

技术标签:

【中文标题】python中的itertools.groupby()【英文标题】:itertools.groupby( ) in python 【发布时间】:2013-06-17 20:50:26 【问题描述】:

我有一组元组。例如:

set([(('E', ('T',)), 0),
 (('F', ('(', 'E', ')')), 0),
 (('T', ('F',)), 0),
 (('__S__', ('E', '$')), 0),
 (('E', ('E', '+', 'T')), 0),
 (('T', ('T', '*', 'F')), 0),
 (('F', ('id',)), 0)])

如您所见,每个元组都有一个元组作为它的第一个元素(例如 ('F', ('(', 'E', ')')) )。 该元组的第一个元素是单个字符,第二个元素是另一个元组(例如 ('(', 'E', ')')) )。此元组中包含一个或多个单个字符。 (它实际上是上下文无关语法。第一个元素是规则(头部)的 LHS,第二个元组是 RHS(主体) 每个元组的第二个元素中的数字是指向此语法 RHS 中字符之一的指针。 我要做的是根据已指向的元素对这些元组进行分组。 为此,我编写了以下代码:

import itertools
S = set([(('E', ('T',)), 0), (('F', ('(', 'E', ')')), 0), (('T', ('F',)), 0), (('__S__', ('E', '$')), 0), (('E', ('E', '+', 'T')), 0), (('T', ('T', '*', 'F')), 0), (('F', ('id',)), 0)])
for v, h in itertools.groupby(S, lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None ):
     if (v is None):
         continue
     print '--'
     print v
     for hi in h:
         print hi

如果 x[0][1][x[1]] 相同,则两个元组在同一个组中。 x[0][1] 是第一个元组的第二个元组(语法的右轴),x[1] 是指针。 我得到以下结果:

--
(
(('F', ('(', 'E', ')')), 0)
--
F
(('T', ('F',)), 0)
--
E
(('__S__', ('E', '$')), 0)
--
T
(('T', ('T', '*', 'F')), 0)
--
id
(('F', ('id',)), 0)
--
T
(('E', ('T',)), 0)
--
E
(('E', ('E', '+', 'T')), 0)

如您所见,有两组键为“T”。我不明白我在这里做错了什么! 我几乎是新的python程序员。以防问题太愚蠢! 谢谢!

【问题讨论】:

我不确定我是否足够好地遵循代码以使其成为答案,但我认为问题在于您使用的是set(无序)。在将集合传递给 groupby 之前,您可能需要使用 groupby 键函数对集合进行排序。 【参考方案1】:

itertools.groupby() 需要对数据进行排序,如果您希望对所有类似的数据进行分组,则按照documentation:

一般来说,iterable 需要已经在同一个键上排序 功能。

groupby() 的操作类似于 Unix 中的 uniq 过滤器。它 每次 key 的值生成一个 break 或 new group 功能变化(这就是为什么通常需要排序 数据使用相同的键功能)。这种行为不同于 SQL 的 GROUP BY 聚合公共元素,而不管它们的 输入顺序。

只需首先对您的数据调用sorted()(将您的函数用作关键函数),然后进行分组。

key_func = lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None
itertools.groupby(sorted(data, key=key_func), key_func)

【讨论】:

谢谢你!它就像魅力一样!我没有阅读文档,只是依靠谷歌搜索!

以上是关于python中的itertools.groupby()的主要内容,如果未能解决你的问题,请参考以下文章

python3:set 和 itertools.groupby 产生不同的结果? [复制]

python itertools groupby 返回元组

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?

使 Pandas groupby 的行为类似于 itertools groupby

为啥 itertools.groupby 可以将 NaN 分组在列表中而不是 numpy 数组中

为啥 itertools.groupby() 不起作用? [复制]