0

我有一组元组。例如:

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] 是第一个元组的第二个元组(语法的 RHS),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程序员。万一问题太傻了!
谢谢!

4

1 回答 1

3

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

通常,iterable 需要已经在相同的 key 函数上排序。

groupby() 的操作类似于 Unix 中的 uniq 过滤器。每次键函数的值发生变化时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序的原因)。这种行为与 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)
于 2013-06-17T20:52:29.927 回答