在作为工程师(而非软件)的工作中,有时我必须使用Python进行编程。在学习了这些教程之后,我了解了字典以及它们如何用于存储数据,快速等。
我嵌套的字典可以达到7个级别,如下所示:
mydict['level1']['level2']['level3']['level4']['level5']['level6']['level7']
我有这些小怪兽,是因为我解析了一个包含如下内容的库的文档:
components['comp1']['comp_name']
components['comp1']['comp_dimension']
components['comp1']['subcomponents']['subcomp1']
components['comp1']['subcomponents']['subcomp1']['comp_name1']
etc.
我还有其他深深嵌套的字典。
我面临的问题是,由于我事先不知道键,因此需要迭代到最后一个级别来获取和过滤结果,所以我像下面的伪代码一样进行迭代:
示例1:漂亮的 filter_subcomps = ["comp1", "comp10"] filter_value = 10.0
for component in components
comp_name = components[component]['comp_name']
comp_dimension = components[component]['comp_dimension']
if components[component].get('subcomponents', False):
subcomp_keys = filter_subcomps if filter_subcomps else components[component]['subcomponents'].keys()
for subcomponent in subcomp_keys:
etc etc
if value > X:
return value
示例2:有点难看(下降3级,还有4级...): # I changed the variable names and cut somethings to give a shorter example. # So there probably are some errors that you should ignore. # The goal is to show the ugliness of my code :)
def get_peak_xy_position(self):
peak_final_lst = list()
x_coord_list = list()
y_coord_list = list()
filter_comp = self.params['options']['filter_comp']
filter_comp_parent = self.params['options']['comp_parent']
filter_peak = self.params['options']['filter_peak']
for xy_coord in self.xy:
peak_xy_list = [0]
x_coord = float(xy_coord.split('_')[0])
y_coord = float(xy_coord.split('_')[1])
if self.components.get(xy_coord, False):
comp_keys = filter_comp if filter_comp else self.components[xy_coord].keys()
for comp in comp_keys:
if self.components[xy_coord].get(comp, False):
if self.components[xy_coord][comp].get('comp_parents', False):
comp_parent_keys = filter_comp_parent if filter_comp_parent else self.components[xy_coord][comp]['comp_parents'].keys()
for parent in comp_parent_keys:
if self.components[xy_coord][comp]['comp_parents'][parent].get('comp_signal', False):
peak_signal = self.components[xy_coord][comp]['comp_parents'][parent]['comp_signal']['peak']
final_peak = current_peak_signal
if filter_peak:
final_peak = current_peak_signal if filter_peak <= current_peak_signal else 0
peak_xy_list.append(final_current)
peak_final_lst.append(max(peak_final_lst))
x_coord_list.append(x_coord)
y_coord_list.append(y_coord)
return x_coord_list, y_coord_list, peak_final_list
这些是一个非常简单的示例,有时代码会进入10多个缩进级别,这看起来很糟糕,我不得不水平滚动页面。除此之外,即使几天或几周后我也很难阅读代码。
我从一些人那里读了一些教程,这些人将列表数据转换为嵌套字典,反之亦然,甚至还使用xpath访问字典键的人们。
无论如何,遵循zen的python,我当然不尊重“扁平比嵌套更好”,因为我的代码进入了缩进的天文水平。
我正在考虑将所有嵌套的dict转换为SQLite并使用SQL语言而不是这些难看的for循环和if条件进行查询。所以我该怎么做?如何处理Python中的嵌套字典,同时保持代码尽可能平坦?我在这里迷路了。
PS:我的问题与“单一比嵌套更好”没有关系-对于数据和代码?因为我已经深深地嵌套了字典。我想知道如何处理这些字典,查询/过滤器值等,同时要有一个固定的代码。
问题来源:stackoverflow
有几种解决该问题的方法:
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。