0

我有一个 python 脚本来解析语法。初始代码是:

num_pro=int(raw_input())

right=[];left=[];

for i in range(num_pro):
  map(list.append, (left, right), raw_input().split('->'))

right_edit=[];left_edit=[];i=0

for rhs in right:
  parts=rhs.split('|')
  for each in parts:
    left_edit.append(left[i])
    right_edit.append(each)
  i+=1

for each in right_edit:
  print left_edit[right_edit.index(each)]+" -> "+each

我正在从包含以下内容的文件中获取输入:

6
E->TZ
Z->+TZ|e
T->FY
Y->*FY|e
F->(E)|a
X->*ZX|e

输出如下:

E -> TZ
Z -> +TZ
Z -> e
T -> FY
Y -> *FY
Z -> e    #unexpected
F -> (E)
F -> a
X -> *ZX
Z -> e    #unexpected

而预期的输出是:

E -> TZ
Z -> +TZ
Z -> e
T -> FY
Y -> *FY
Y -> e    #expected
F -> (E)
F -> a
X -> *ZX
X -> e    #expected

我搜索并发现字典不允许使用相同的键,并且在集合中也不允许使用相同的值。在我的代码中,我没有使用字典或集合。我也不用list.index(value)。仍然为什么会有这样的输出。如何获得预期的输出。

4

2 回答 2

4

无关dict。您的列表实际上包含预期的内容。

罪魁祸首是输出打印语句:

print left_edit[right_edit.index(each)]+" -> "+each

right_edit.index(each)将找到第一个元素。由于您有多个es ,它总是会找到第一个并将其映射到Z.

使用类似的东西:

for l, r in zip(left_edit, right_edit):
  print l, "->", r

或者:

for i, r in enumerate(right_edit):
  print left_edit[i], "->", r

或者更好的是,选择更好的数据结构而不是两个不同的列表。我想到了一个简单的二元组列表,所以基本上是zip()上面示例中产生的内容。

于 2013-09-10T11:05:02.200 回答
1

我建议稍微重构一下你的代码。我建议不要并排使用两个列表,而是在列表中使用元组:

代替

left.append(1)
right.append('a') 

你会做的

edit.append((1,'a'))

您的管道参数也是如此,它们应该放在第二个元组元素的列表中:

edit.append(('Z', ['+TZ','e']))

代码将如下所示:

num_pro=int(raw_input())

command=[];

for i in range(num_pro):
  command.append(raw_input().split('->'))    # command is a list of tuples,
                                             # split by '->'

edit=[];

for cmd in command:
  parts = cmd[1].split('|')
  edit.append((cmd[0], parts))          # edit is a list of tuples, the first one
                                        # being the keyword before the '->',
                                        # the second one being a list of all
                                        # arguments, split by |

print(edit)

# now printing is simply a matter of two nested fors

for each in edit:
  for item in each[1]:
    print each[0]+" -> "+item

这显示了以下输出:

[('E', ['TZ']), ('Z', ['+TZ', 'e']), ('T', ['FY']), 
 ('Y', ['*FY', 'e']), ('F', ['(E)', 'a']),
 ('X', ['*ZX', 'e'])]

E -> TZ
Z -> +TZ
Z -> e
T -> FY
Y -> *FY
Y -> e
F -> (E)
F -> a
X -> *ZX
X -> e
于 2013-09-10T11:19:15.333 回答