首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将嵌套列表映射到平面值

如何将嵌套列表映射到平面值
EN

Stack Overflow用户
提问于 2021-12-25 17:57:44
回答 1查看 76关注 0票数 -1

我正试图用如下所示的标题解析电子表格:

我的问题是"Контрагент“下面的嵌套键。我决定像这样解析它:

代码语言:javascript
运行
复制
['Дата',
 'Номер документа',
 'Дебет',
 'Кредит',
 ['Контрагент',
  ['Наименование', 'ИНН', 'КПП', 'Счет', 'БИК', 'Наименование банка']],
 'Назначение платежа',
 'Код дебитора',
 'Тип документа']

但现在,我真的不知道如何将它映射到一个简单的值列表:

代码语言:javascript
运行
复制
['21.05.2021',
 '591324565436',
 '0.00',
 '526345428.99',
 'asdasd',
 '234525460140679',
 '77130100123412341',
 '302328105423534200000000280',
 '0445252345234974',
 'asdfsadfsd',
 'sdfghsfgdhfdghdfgh',
 '',
 'dfghfgdhfdgh']

给定这些变量,我想要一个函数返回以下dict:

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

我已经走了这么远,没有意识到它会在第三行提高IndexError

代码语言:javascript
运行
复制
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

我该怎么办?也许模式的结构不够好?我真的不知道..。

EN

Stack Overflow用户

发布于 2021-12-25 18:23:34

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

代码语言:javascript
运行
复制
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}

产出:

代码语言:javascript
运行
复制
{'Дата': '21.05.2021',
 'Номер документа': '591324565436',
 'Дебет': '0.00',
 'Кредит': '526345428.99',
 'Контрагент': {'Наименование': 'asdasd',
  'ИНН': '234525460140679',
  'КПП': '77130100123412341',
  'Счет': '302328105423534200000000280',
  'БИК': '0445252345234974',
  'Наименование банка': 'asdfsadfsd'},
 'Назначение платежа': 'sdfghsfgdhfdghdfgh',
 'Код дебитора': '',
 'Тип документа': 'dfghfgdhfdgh'}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70481808

复制
相关文章

相似问题

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