基于父键值的列表组

时间:2020-05-16 03:37:29

标签: python

尝试通过基于键(父级和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']
        }
    ]
}

1 个答案:

答案 0 :(得分: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,但我相信您比我更了解您的需求。

相关问题