【发布时间】:2021-04-22 05:14:59
【问题描述】:
我有一个代表菜单的 yaml 字符串。在我从中获得字典后,我尝试获取 URL,简单地说是 Parameter 的键 url 以及不是 Parameter 的其他元素的列表的每个第一个元素。
这是我尝试过的
import yaml
import jmespath
import pprint
setting = """
GeneralSetting:
- Description: General Setting
MenuSetting:
- Description: Menu Setting
- Setting:
- AutoMenu:
- Description: Register menu
- HelpText: This is for auto create menu
- Value:
- Sample:
- Parameter:
- icon: fa fa-birthday-cake
- Active: Y
- Sample: [Sample]
- Sample Account: [SampleAccount]
- Multi Journal:
- Parameter:
- icon: fas fa-book
- url: MultiJournal
- Foreign Exchange:
- Parameter:
- icon: fa fa-money-bill-alt
- url: ForeignExchange
- Loan Contract:
- Parameter:
- icon: fa fa-capsules
- Active: Y
- Loan Contract: [LoanContract,1]
- Loan Report:
- Loan Detail Listing: [LoanDetailListing,1]
- Loan Application Detail Listing: [ReportR003,1]
"""
toDict = yaml.load(setting, yaml.SafeLoader)
pp = pprint.PrettyPrinter(indent=2)
# ALL
ALL = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[]', toDict)
ParentURL = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[0][].Parameter[].url', toDict)
NotParameter = {key:value for item in ALL for it in item for key,value in it.items() if key != "Parameter"}
# pp.pprint(NotParameter)
# print ('-----')
SubURL = jmespath.search('*[0]', NotParameter)
SubSubURL = jmespath.search('*[].*[][]', NotParameter)
pp.pprint(ParentURL)
print('---')
pp.pprint(SubURL)
print('---')
pp.pprint(SubSubURL)
由此,我只能对 Parameter 下的 url 的父 URL(例如 [MultiJournal,ForeignExchange])做得很好,但对于子和子子却不行。
我只想要 url 的最终结果作为这个列表
[Sample,SampleAccount,MultiJournal,ForeignExchange,LoanContract,LoanDetailListing,Report/R003]
我尝试了几种方法,但仍然无法得到结果?
有什么方法可以让我得到这样的价值清单吗?谢谢
【问题讨论】:
-
你的 YAML 对我来说似乎坏了,你似乎混淆了 YAML 中的 list 和 dict。相关:stackoverflow.com/questions/30221348/…