简体   繁体   English

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

[英]Is there an elegant way to create a dictionary of arrays?

I frequently analyse data which has a parent child relationship: 我经常分析具有父子关系的数据:

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},
]

Typically I'll use a loop like this to create a new data structure so I can easily relate parent and child data: 通常,我将使用这样的循环来创建新的数据结构,以便可以轻松地关联父数据和子数据:

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"])

This produces the following data: 这将产生以下数据:

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

Is there a more elegant way to create the "parents" data structure? 有没有更优雅的方式来创建“父母”数据结构?

I don't know, what do you mean by more elegant. 我不知道,您所说的更加优雅意味着什么。 If you are writing some parsing script, than it seems that using built in structures is ok. 如果您正在编写一些解析脚本,那么似乎可以使用内置结构。 So are you asking about used data structures or your code? 那么,您是在询问使用的数据结构还是代码?

One thing I see is that you can use setdefault instead of checking if you have certain key in dictionary: 我看到的一件事是,您可以使用setdefault而不是检查字典中是否具有某些键:

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

If your Python version includes collections.defaultdict you can do: 如果您的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]}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM