有没有一种优雅的方法来创建数组字典?

时间:2011-02-21 10:07:10

标签: python

我经常分析具有父子关系的数据:

data = [
    {'data': 'somedata', 'id': 1, 'parentId': 0},
    {'data': 'somedata', 'id': 2, 'parentId': 1},
    {'data': 'somedata', 'id': 3, 'parentId': 0},
    {'data': 'somedata', 'id': 4, 'parentId': 3},
    {'data': 'somedata', 'id': 5, 'parentId': 3},
]

通常我会使用这样的循环来创建一个新的数据结构,以便我可以轻松地关联父数据和子数据:

for item in data:
    if item["parentId"] != 0:
        if item["parentId"] in parents:
            parents[item["parentId"]].append(item["id"])
        else:
            parents[item["parentId"]] = []
            parents[item["parentId"]].append(item["id"])

这会产生以下数据:

print parents
{1: [2], 3: [4, 5]}

是否有更优雅的方式来创建“父母”数据结构?

2 个答案:

答案 0 :(得分:4)

我不知道,更优雅的是什么意思。如果您正在编写一些解析脚本,那么使用内置结构似乎没问题。那么您是否在询问使用过的数据结构或代码?

我看到的一件事是您可以使用setdefault而不是检查字典中是否有某个键:

for item in data:
    if item["parentId"] != 0:
        parents.setdefault(item["parentId"], []).append(item['id'])

答案 1 :(得分:2)

如果你的Python版本包含collections.defaultdict,你可以这样做:

from collections import defaultdict

def make_parent_dict(data):
    parents = defaultdict(list) # Use empty list for missing entries
    for item in data:
        parent = item['parentId']
        if parent != 0:
            parents[parent].append(item['id'])
    return dict(parents) # Convert back to normal dict

example = [
    {'data': 'somedata', 'id': 1, 'parentId': 0},
    {'data': 'somedata', 'id': 2, 'parentId': 1},
    {'data': 'somedata', 'id': 3, 'parentId': 0},
    {'data': 'somedata', 'id': 4, 'parentId': 3},
    {'data': 'somedata', 'id': 5, 'parentId': 3},
]

>>> print make_parent_dict(example)
{1: [2], 3: [4, 5]}