Python 具有重复命名标记的ParseResults输出结构:如何保持命名字典中的顺序 让我们考虑下面我创建的代码,它反映了我的问题(以下我的前一个问题:): 从pyparsing导入* 行='a(1)->b(2)->c(3)->b(4)->a(5)' LPAR,RPAR=map(抑制“()”) num=单词(nums) SEQOP=抑制('->')) a=组(Literal('a')+LPAR+num+RPAR)('ela*')) b=组(Literal('b')+LPAR+num+RPAR)('elb*')) c=组(Literal('c')+LPAR+num+RPAR)('elc*')) 元素=a | b | c 一个表达式=组(元素+(元素+元素)[…])(“一个表达式”) out=一个表达式解析字符串(行) 打印(out.dump())

Python 具有重复命名标记的ParseResults输出结构:如何保持命名字典中的顺序 让我们考虑下面我创建的代码,它反映了我的问题(以下我的前一个问题:): 从pyparsing导入* 行='a(1)->b(2)->c(3)->b(4)->a(5)' LPAR,RPAR=map(抑制“()”) num=单词(nums) SEQOP=抑制('->')) a=组(Literal('a')+LPAR+num+RPAR)('ela*')) b=组(Literal('b')+LPAR+num+RPAR)('elb*')) c=组(Literal('c')+LPAR+num+RPAR)('elc*')) 元素=a | b | c 一个表达式=组(元素+(元素+元素)[…])(“一个表达式”) out=一个表达式解析字符串(行) 打印(out.dump()),python,python-3.x,pyparsing,Python,Python 3.x,Pyparsing,从该代码中,我获得以下结果: [['a',1'],['b',2'],['c',3'],['b',4'],['a',5']] -一个表达式:['a','1'],['b','2'],['c','3'],['b','4'],['a','5']] -ela:['a','1',['a','5']] [0]: ['a','1'] [1]: ['a','5'] -elb:['b','2',['b','4']] [0]: ['b','2'] [1]: ['b','4'] -elc:[['c','3']] [0]

从该代码中,我获得以下结果:

[['a',1'],['b',2'],['c',3'],['b',4'],['a',5']]
-一个表达式:['a','1'],['b','2'],['c','3'],['b','4'],['a','5']]
-ela:['a','1',['a','5']]
[0]:
['a','1']
[1]:
['a','5']
-elb:['b','2',['b','4']]
[0]:
['b','2']
[1]:
['b','4']
-elc:[['c','3']]
[0]:
['c','3']
我们可以通过不同的方式访问结果:

>输出[0]
(a,1,{},(b,2,{}),(c,3),(b,4),(a,5),{}(b,2),{(,4),{})),((a,5),(,(,(,1)),),(,(),
>>out['one seq_expr']
(a,1,{},(b,2,{}),(c,3),(b,4),(a,5),{}(b,2),{(,4),{})),((a,5),(,(,(,1)),),(,(),
>>out['one seq_expr'][0:4]
[(['a','1'],{}),(['b','2'],{}),(['c','3'],{}),(['b','4'],{})]
>>对于uu-in-out[0]:打印(u)
['a','1']
['b','2']
['c','3']
['b','4']
['a','5']
>>out['one_seq_expr']['ela']
([(['a',1'],{}),(['a',5'],{})],{})
ParseResults对象
out['one\u seq\u expr']
保持找到的不同令牌的顺序。另一方面,命名标记的结构是按名称对它们进行分组,并保持每个名称的出现顺序

是否有可能获得一个输出结构,其中不同元素之间保持顺序,同时名称保持某种形式?比如:

-一个表达式:[a',1'],[b',2'],[c',3'],[b',4'],[a',5']]
-ela_0:[[a',1']]
[0]:
['a','1']
-厄尔巴诺0:[['b','2']]
[0]:
['b','2']
-elc_0:[['c','3']]
[0]:
['c','3']
-厄尔巴鄂1:[['b','4']]
[0]:
['b','4']
-ela_0:[[a',5']]
[0]:
['a','5']
或者我们必须在标记的有序列表上使用
out['one\u seq\u expr']
?例如:

>>[\uu.getName()用于uu-in-out['one\u-seq\u-expr']]
['ela','elb','elc','elb','ela']

您可以使用解析操作对这些元素及其各自的类型进行注释,这些元素将与每个元素一起保留:

a.addParseAction(lambda t: t[0].insert(0, "ELA_TYPE"))
b.addParseAction(lambda t: t[0].insert(0, "ELB_TYPE"))
c.addParseAction(lambda t: t[0].insert(0, "ELC_TYPE"))
使用这些表达式进行解析并转储结果(手动重新格式化):

我很少使用
getName()
——它最初是为了支持弃用的
asXML()
方法而编写的,该方法将在pyparsing 3.0中删除。但是这似乎是对
getName
的合法使用,我想我会将其添加到pyparsing单元测试中。一般来说,将结果名称想象成dict中的键,将多个值分配给一个键只会保留最后分配的值。如果使用
listAllMatches=True
或尾随“*”进行特殊名称,则更像是
defaultdict(list)
,它将为一个键保留多个值,但在整个列表中失去各自的顺序。
- one_seq_expr: [['ELA_TYPE', 'a', '1'], 
                 ['ELB_TYPE', 'b', '2'], 
                 ['ELC_TYPE', 'c', '3'], 
                 ['ELB_TYPE', 'b', '4'], 
                 ['ELA_TYPE', 'a', '5']]
   ... etc. ...