Python如何声明绑定自定义类的嵌套字典以存储RSSI分析数据
实现方案
方案1:调整自定义类初始化+defaultdict实现等效C++ map逻辑
第一步:优化自定义类构造函数
你原有的类需要在实例化时传入所有列表参数,使用门槛较高,修改为默认初始化所有属性为空列表即可:
class summary_lists(object): def __init__(self, dist_list=None, mean_list=None, median_list=None, mode_list=None, std_dev_list=None, mmode_list=None, unique_count_list=None, total_datapoint_list=None, min_list=None, max_list=None): self.dist_list = dist_list if dist_list is not None else [] self.mean_list = mean_list if mean_list is not None else [] self.mode_list = mode_list if mode_list is not None else [] self.median_list = median_list if median_list is not None else [] self.std_dev_list = std_dev_list if std_dev_list is not None else [] self.mmode_list = mmode_list if mmode_list is not None else [] self.unique_count_list = unique_count_list if unique_count_list is not None else [] self.total_datapoint_list = total_datapoint_list if total_datapoint_list is not None else [] self.min_list = min_list if min_list is not None else [] self.max_list = max_list if max_list is not None else []
第二步:声明目标数据结构
使用collections.defaultdict设置默认工厂函数为summary_lists,即可实现你期望的调用逻辑,和C++中map<int, summary_lists>的用法完全一致:
import collections ch_rssiattr_list = collections.defaultdict(summary_lists)
使用示例:
# 直接按信道访问对应类实例,追加统计值即可 channel = 6 current_mean = -47.3 ch_rssiattr_list[channel].mean_list.append(current_mean)
方案2:不修改原有类的替代声明方式
如果你不想改动原有summary_lists的定义,可以直接在defaultdict的工厂函数中传入所有空列表参数:
import collections ch_rssiattr_list = collections.defaultdict(lambda: summary_lists([],[],[],[],[],[],[],[],[]))
可选优化:用dataclass简化类定义
Python 3.7内置的dataclasses模块可以大幅简化纯数据类的定义,无需手动编写冗长的初始化逻辑:
from dataclasses import dataclass, field from typing import List import collections @dataclass class SummaryLists: dist_list: List[float] = field(default_factory=list) mean_list: List[float] = field(default_factory=list) median_list: List[float] = field(default_factory=list) mode_list: List[float] = field(default_factory=list) std_dev_list: List[float] = field(default_factory=list) mmode_list: List[float] = field(default_factory=list) unique_count_list: List[int] = field(default_factory=list) total_datapoint_list: List[int] = field(default_factory=list) min_list: List[float] = field(default_factory=list) max_list: List[float] = field(default_factory=list) # 声明数据结构的方式完全不变 ch_rssiattr_list = collections.defaultdict(SummaryLists)
内容的提问来源于stack exchange,提问作者chaz88
相关产品推荐
相关产品推荐

