簡體   English   中英

如何將 map 嵌套列表轉換為平面值

[英]How to map nested list to flat values

我正在嘗試使用看起來像這樣的 header 解析電子表格: 標題

我的問題是“Контрагент”下方的那些嵌套鍵。 我決定像這樣解析它:

['Дата',
 'Номер документа',
 'Дебет',
 'Кредит',
 ['Контрагент',
  ['Наименование', 'ИНН', 'КПП', 'Счет', 'БИК', 'Наименование банка']],
 'Назначение платежа',
 'Код дебитора',
 'Тип документа']

但是現在,我真的不知道如何將 map 轉換為一個平面值列表:

['21.05.2021',
 '591324565436',
 '0.00',
 '526345428.99',
 'asdasd',
 '234525460140679',
 '77130100123412341',
 '302328105423534200000000280',
 '0445252345234974',
 'asdfsadfsd',
 'sdfghsfgdhfdghdfgh',
 '',
 'dfghfgdhfdgh']

鑒於這些變量,我想要一個 function 返回以下字典:

{
    "Дата": "21.05.2021",
    "Номер документа": "591324565436",
    "Дебет": "0.00",
    "Кредит": "526345428.99",
    "Контрагент": {
        "Наименование": "asdasd",
        "ИНН": "234525460140679",
        "КПП": "77130100123412341",
        "Счет": "302328105423534200000000280",
        "БИК": "0445252345234974",
        "Наименование банка": "asdfsadfsd"
    },
    "Назначение платежа": "sdfghsfgdhfdghdfgh",
    "Код дебитора": "",
    "Тип документа": "dfghfgdhfdgh"
}

我已經走了這么遠,卻沒有意識到它會在第 3 行引發IndexError

def map_to_schema(schema, data):
    for i, elem in enumerate(data):
        key = schema[i]
        if isinstance(key, list):
            if key[0] not in result:
                result[key[0]] = {}
            
            result[key[0]] |= {
                key[1][i-len(key)]: elem
            }
        else:
            result[key] = elem

我應該怎么辦? 也許架構的結構不夠好? 我真的不知道...

您可以使用字典理解和迭代器:

headers = ['Дата', 'Номер документа', 'Дебет', 'Кредит',
           ['Контрагент',  ['Наименование', 'ИНН', 'КПП', 'Счет', 'БИК', 'Наименование банка']],
           'Назначение платежа', 'Код дебитора', 'Тип документа']
values = ['21.05.2021', '591324565436', '0.00', '526345428.99', 'asdasd', '234525460140679', '77130100123412341',
 '302328105423534200000000280', '0445252345234974', 'asdfsadfsd', 'sdfghsfgdhfdghdfgh', '',
 'dfghfgdhfdgh']

it = iter(values)

out = {k[0] if (islist := isinstance(k, list)) else k:
       {k2: next(it) for k2 in k[1]} if islist else next(it)
       for k in headers}

output:

{'Дата': '21.05.2021',
 'Номер документа': '591324565436',
 'Дебет': '0.00',
 'Кредит': '526345428.99',
 'Контрагент': {'Наименование': 'asdasd',
  'ИНН': '234525460140679',
  'КПП': '77130100123412341',
  'Счет': '302328105423534200000000280',
  'БИК': '0445252345234974',
  'Наименование банка': 'asdfsadfsd'},
 'Назначение платежа': 'sdfghsfgdhfdghdfgh',
 'Код дебитора': '',
 'Тип документа': 'dfghfgdhfdgh'}

感謝@mozway 提供此解決方案

這是相同的算法,使用 for 循環:

order = {}
for key in schema:
    if isinstance(key, list):
        order[key[0]] = {}
        for sub_key in key[1]:
            order[key[0]][sub_key] = next(iter_row)
    else:
        order[key] = next(iter_row)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM