首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在output解析中,如何格式化嵌套的字典输出?

在output解析中,如何格式化嵌套的字典输出?
EN

Stack Overflow用户
提问于 2013-10-13 12:26:30
回答 3查看 706关注 0票数 2

我使用pyparsing来解析以下输入:

代码语言:javascript
复制
%FSLAX45Y67*%

我所追求的输出格式,以字典的形式,是:

代码语言:javascript
复制
{
  'notation': 'absolute', 
  'zeros': 'leading', 
  'x': {
    'integer': 4, 
    'decimal': 5
  }, 
  'y': {
    'integer': 6, 
    'decimal': 7,
  }, 
  'gerber-command': 'FS'
}

我目前得到的输出是:

代码语言:javascript
复制
{
  'notation': 'absolute', 
  'decimal': 6, 
  'zeros': 'leading', 
  'integer': 6, 
  'y': ([6, 6], {'integer': [(6, 0)], 'decimal': [(6, 1)]}), 
  'x': ([6, 6], {'integer': [(6, 0)], 'decimal': [(6, 1)]}), 
  'gerber-command': 'FS'
 }

(请注意,我的问题不是如何使输出看上去正确,而是如何使pyparsing以我想要的方式排列数据。)

使用以下代码:

代码语言:javascript
复制
single_digit = pyp.Regex(r'(\d)').setParseAction(lambda t: int(t[0]))

cmd_format = pyp.Literal('FS')
cmd_format_opt_leading_zeros = pyp.Literal('L').setParseAction(pyp.replaceWith('leading'))
cmd_format_opt_trailing_zeros = pyp.Literal('T').setParseAction(pyp.replaceWith('trailing'))

format_zeros = ((cmd_format_opt_leading_zeros('zeros')) |
               (cmd_format_opt_trailing_zeros('zeros')))

format_notation = ((cmd_format_opt_absolute('notation')) |
                  (cmd_format_opt_incremental('notation')))

format_data = (single_digit)('integer') + single_digit('decimal')

gformat = (inst_del +
           cmd_format('gerber-command') +
           format_zeros +
           format_notation +
           'X' + (format_data)('x') + 
           'Y' + (format_data)('y') + 
           inst_end +
           inst_del)

(省略了一些琐碎的定义)。有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-13 16:37:02

使用pyparsing向返回的令牌添加结构。这可能会完成以下工作:

代码语言:javascript
复制
gformat = (inst_del +
           cmd_format('gerber-command') +
           format_zeros +
           format_notation +
           'X' + pyp.Group(format_data)('x') + 
           'Y' + pyp.Group(format_data)('y') + 
           inst_end +
           inst_del)

return的默认行为是只返回一个平面的令牌列表,这样就不会仅仅根据添加了什么顺序的术语来猜测结构。例如,如果您有以下内容:

代码语言:javascript
复制
aword = Word("A")
bword = Word("B")
cword = Word("C")

preface = aword + bword
body = cword
ending = aword + bword

totalExpr = preface + body + ending

print totalExpr.parseString("AA BB CCC A B").asList()

吡咯烷酮只返回列表

代码语言:javascript
复制
['AA', 'BB', 'CCC', 'A', 'B']

如果您想应用结构(这对于防止嵌套结果名称相互践踏特别重要,正如在整数和十进制的重叠中所看到的那样),请使用Group:

代码语言:javascript
复制
totalExpr = Group(preface) + body + Group(ending)

这意味着:

代码语言:javascript
复制
[['AA', 'BB'], 'CCC', ['A', 'B']]

如果您添加了结果名称,这将是这样的:

代码语言:javascript
复制
preface = aword("As") + bword("Bs")
body = cword
ending = aword("As") + bword("Bs")

totalExpr = Group(preface)("preface") + body("body") + Group(ending)("ending")
print totalExpr.parseString("AA BB CCC A B").dump()

给予:

代码语言:javascript
复制
[['AA', 'BB'], 'CCC', ['A', 'B']]
- body: CCC
- ending: ['A', 'B']
  - As: A
  - Bs: B
- preface: ['AA', 'BB']
  - As: AA
  - Bs: BB

因为前言和结尾是分组的,所以他们重复的名字"As“和”B“是分开的。

票数 2
EN

Stack Overflow用户

发布于 2013-10-13 12:29:32

您必须自由地使用setParseAction来删除不需要的信息。在format_data中,您需要一个函数,该函数从single_digit获取输出并将其转换为所需的格式。

代码语言:javascript
复制
def _format_data(x):
    return {"integer": x["integer"][0][0],
            "decimal": x["decimal"][0][0]}

format_data.setParseAction(_format_data)
票数 1
EN

Stack Overflow用户

发布于 2013-10-13 13:30:36

有趣的是,为什么困难的问题总是以递归结束?

代码语言:javascript
复制
x=\
{
  'notation': 'absolute', 
  'zeros': 'leading', 
  'x': {
    'integer': 4, 
    'decimal': 5
  }, 
  'y': {
    'integer': 6, 
    'decimal': 7,
  }, 
  'gerber-command': 'FS'
}

def superPrint(inidic={},indent='  '):
    for k,v in inidic.items():
        if isinstance(v,dict):
            yield "\n%s'%s': {"%(indent,k)
            for i in superPrint(v,indent+' '*(len(k)+1)):
                yield i
            yield "\n%s},"%indent
        else:
            yield "\n%s'%s': '%s',"%(indent,k,v)

print '{%s\n}'%''.join(superPrint(x))

结果:

代码语言:javascript
复制
{
  'y': {
    'integer': '6',
    'decimal': '7',
  },
  'x': {
    'integer': '4',
    'decimal': '5',
  },
  'zeros': 'leading',
  'notation': 'absolute',
  'gerber-command': 'FS',
}

注意,根据你对同性恋的描述,我不确定你是否想要一个",“在一个词的最后一个元素。

试得更深一点:

代码语言:javascript
复制
x=\
{
  'notation': 'absolute', 
  'zeros': 'leading', 
  'x': {
    'integer': 4, 
    'decimal': 5
  }, 
  'y': {
    'integer': 6, 
    'decimal': {'try':7,
                'tryHarder':{'wow':8,
                             'seemsGood':{'wooow':9}}},
  }, 
  'gerber-command': 'FS'
}

print '{%s\n}'%''.join(superPrint(x))

看上去不错:

代码语言:javascript
复制
{
  'y': {
    'integer': '6',
    'decimal': {
            'try': '7',
            'tryHarder': {
                      'wow': '8',
                      'seemsGood': {
                                'wooow': '9',
                      },
            },
    },
  },
  'x': {
    'integer': '4',
    'decimal': '5',
  },
  'zeros': 'leading',
  'notation': 'absolute',
  'gerber-command': 'FS',
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19345214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档