タプルのセットがあります。例えば:
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プログラマーです。問題があまりにもばかげている場合に備えて!
ありがとう!