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', ')')) )。
このタプルの最初の要素は 1 文字で、2 番目の要素は別のタプルです (例: ('(', 'E', ')')) )。このタプルには 1 つ以上の 1 文字が含まれています。
(実際には Context Free Grammar です。最初の要素はルールの LHS(head)、2 番目のタプルは RHS(body)
です。各タプルの 2 番目の要素の番号は、この文法の RHS の文字の 1 つへのポインタです。

私が試していることやるべきことは、ポイントされている要素に関してこのタプルをグループ化することです.
この目的のために、私は次のコードを書きました:

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]] が同じ場合、2 つのタプルは同じグループに属します。x[0][1] は最初のタプルの 2 番目のタプル (文法の右辺) であり、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」を持つ 2 つのグループがあります。ここで何が間違っているのかわかりません!
私はほとんど新しいpythonプログラマーです。問題があまりにもばかげている場合に備えて!
ありがとう!

4

1 に答える 1

3

itertools.groupby()ドキュメントに従って、同様のデータをすべてグループ化する場合は、データを並べ替える必要があります。

一般に、イテラブルは同じキー関数ですでにソートされている必要があります。

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 に答える