Инициализировать Python словарь с другим словарем - PullRequest
2 голосов
/ 18 марта 2020

Я хотел бы инициализировать словарь и всегда назначать пустую структуру данных каждому ключу, который затем будет использоваться позже.

Это результат и поведение, которое я хотел бы:

data = {
    "record" : {
        "fields_array" : [],
        "df" : pd.DataFrame(),
        "df_fields" : pd.DataFrame(columns = ["name", "units", "field_type", "base_type", "type"]),
        "rows" : []
    },
    "device_info" : {
        "fields_array" : [],
        "df" : pd.DataFrame(),
        "df_fields" : pd.DataFrame(columns = ["name", "units", "field_type", "base_type", "type"]),
        "rows" : []
    },
}

Таким образом, каждый ключ ссылается на уникальный DataFrame или массив.

Я хотел бы просто написать свой код следующим образом:

data_struct = {  
        "fields_array" : [],
        "df" : pd.DataFrame(),
        "df_fields" : pd.DataFrame(columns = ["name", "units", "field_type", "base_type", "type"]),
        "rows" : []
}

data = {
    "record" : data_struct,
    "device_info" : data_struct,
}

Однако, если я сейчас использую data["record"]["df"] или data["device_info"]["df"], они ссылаются на один и тот же DataFrame.

Почему такое поведение и как я могу решить эту проблему? Мне нужно добавить еще много ключей в словарь data.

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Вы можете использовать collections.defaultdict:

data = defaultdict(lambda: {  
    "fields_array" : [],
    "df" : pd.DataFrame(),
    "df_fields" : pd.DataFrame(columns = ["name", "units", "field_type", "base_type", "type"]),
    "rows" : []
})

, а затем просто получить доступ к любым клавишам:

data['record']
data['device_info']
2 голосов
/ 18 марта 2020

Использование Deepcopy

data = {
    "record" : deepcopy(data_struct),
    "device_info" : deepcopy(data_struct),
}
...