我在yaml中有一个输入,包含不同级别的嵌套对象.我需要一个Python函数来判断所有的并获得所需的输出—字符串列表,其中每个字段被点分隔,如果嵌套—Object1.Object2.Object3.Object4...下面的例子.

我试图用递归函数来实现它.我的代码片段:

tests = []
test2 = {}
def test(config, parent=None):
    previous_parent = None
    names = []
    for column in config:
    
        if column.get("dtype") in ["array", "struct"]:
            parent = column["name"]
            print(f"parent: {parent}")
            test(column["columns"], parent)
            
        else:
            value = column["name"]
            print(f"value: {value}")
            # names.append(value)

输出是:

value: PartitionDate
value: TransactionID
value: EventTimestamp
parent: ControlTransaction
value: StoreID
parent: RetailTransaction
value: StoreID
value: WorkstationID
...

输入:

columns:
- name: PartitionDate
- name: TransactionID
- name: EventTimestamp
- name: ControlTransaction
  dtype: struct
  columns:
    - name: StoreID
    - name: WorkstationID
    - name: Transaction
      dtype: struct
      columns:
        - name: TransactionID
    - name: TransactionNumber
- name: ControlType
- name: RetailTransaction
  dtype: struct
  columns:
    - name: StoreID
    - name: WorkstationID

输出:

[
PartitionDate,
TransactionID,
EventTimestamp,
ControlTransaction.StoreID,
ControlTransaction.WorkstationID,
ControlTransaction.Transaction.TransactionID,
ControlTransaction.TransactionNumber,
ControlType,
RetailTransaction.StoreID,
RetailTransaction.WorkstationID
]

推荐答案

只是一些变化:

  1. 将参数parent=None替换为parents=[]以提供完整的父名列表.
  2. 如果一列包含嵌套的"columns":
    • 把它的名字加到parent名单上.
    • 使用递归获取嵌套项的值路径.
    • 将这些值加到结果names中.
  3. 如果一个列不包含嵌套的"columns":将其名称与parentsjoin合并使用.分隔符.
  4. names退回go .
import yaml

def test(config, parents=[]):
    names = []
    for column in config:
        
        if column.get("dtype") in ["array", "struct"] and "columns" in column:
            cur_parents = parents.copy()
            cur_parents.append(column["name"])
            children = test(column["columns"], cur_parents)
            names.extend(children)

        else:
            value = column["name"]
            value_path = parents + [value]
            names.append(".".join(value_path))

    return names

with open("input.yaml", "r") as inp:
    yaml_conf = yaml.safe_load(inp)

values = test(yaml_conf.get("columns"))

print("[\n{}\n]".format(",\n".join(values)))

Edit:,make sure to check the important notes made by @Anthon in the comments and in another answer..

Python相关问答推荐

使用mySQL的SQlalchemy过滤重叠时间段

我从带有langchain的mongoDB中的vector serch获得一个空数组

如何记录脚本输出

从groupby执行计算后创建新的子框架

NumPy中条件嵌套for循环的向量化

部分视图的DataFrame

如何在UserSerializer中添加显式字段?

Pandas Loc Select 到NaN和值列表

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

matplotlib + python foor loop

如何使用OpenGL使球体遵循Python中的八样路径?

Pandas—堆栈多索引头,但不包括第一列

pandas:在操作pandora之后将pandora列转换为int

设置索引值每隔17行左右更改的索引

Polars定制函数返回多列

我如何处理超类和子类的情况

如何将验证器应用于PYDANC2中的EACHY_ITEM?

如何在Django查询集中生成带有值列表的带注释的字段?

将参数从另一个python脚本中传递给main(argv

基于2级列表的Pandas 切片3级多索引