0

尝试通过基于键的分组来构建层次结构列表 - parent 和 account_name

lst = [
    {
        "parent": "abc",
        "account_name": "abc1",
        "account_number": "119445",
    },
    {
        "parent": "abc",
        "account_name": "abc2",
        "account_number": "119446",
    },
    {
        "parent": "abc",
        "account_name": "abc2",
        "account_number": "119447",
    }
]

所需的 O/P

{
    'abc': [
        {
            'abc1': ['119445'], 
            'abc2': ['119446', '119447']
        }
    ]
}

尝试过setdefault,但没有得到我想要的输出。

parent = {}
account_name = {}
account_number = {}


for i in lst:
    j = i['account_number']
    account_name.setdefault(i['account_name'], []).append(j)
    parent.setdefault(i['parent'],[]).append(account_name)

print(parent)
{
    'abc': [
        {
            'abc1': ['119445'],
            'abc2': ['119446', '119447']
        },
        {
            'abc1': ['119445'],
            'abc2': ['119446', '119447']
        },
        {
            'abc1': ['119445'],
            'abc2': ['119446', '119447']
        }
    ]
}
4

1 回答 1

0

这里有一个itertools.groupby

parent = {}

# group by parent key
for p, data in it.groupby(lst, key=lambda d: d['parent']):

    # for each group, create a new inner dict
    inner_dict = {}

    # setdefault and append the account numbers to the list
    for d in data:
        inner_dict.setdefault(d['account_name'], []).append(d['account_number'])

    # setdefault and append the inner dict to the list
    parent.setdefault(p, []).append(inner_dict)

结果:

{
  'abc': [
    {
      'abc1': ['119445'], 
      'abc2': ['119446', '119447']
    }
  ]
}

我不太确定内部是否需要list包裹内部dict,但我相信你比我更清楚你需要什么。

于 2020-05-16T04:33:02.017 回答