python - 如何在有序字典中获得正确数量的子元素?
问题描述
我有以下 2 个相似的有序字典(它们是前面步骤的输出),唯一的区别是dict1
只有一个节点被命名GROUP
并且dict2
有两个(0 和 1,如图中所示)
from collections import OrderedDict
dict1 = OrderedDict([('CATALOG',
OrderedDict([('GROUP',
OrderedDict([
('ZONE', '4'),
('LIGHT', 'Mostly Shady'),
('PLANT', [
OrderedDict([
('COMMON', 'Bloodroot'),
('BOTANICAL', 'Sanguinaria canadensis')]),
OrderedDict([
('COMMON', 'Columbine'),
('BOTANICAL', 'Aquilegia canadensis')])])]))]))])
dict2 = OrderedDict([('CATALOG',
OrderedDict([('GROUP', [
OrderedDict([
('ZONE', '3'),
('LIGHT', 'Mostly Shady'),
('PLANT', [
OrderedDict([
('COMMON', "Dutchman's-Breeches"),
('BOTANICAL', 'Dicentra cucullaria')]),
OrderedDict([
('COMMON', 'Ginger, Wild'),
('BOTANICAL', 'Asarum canadense')])])]),
OrderedDict([
('ZONE', '4'),
('LIGHT', 'Mostly Sunny'),
('PLANT', [
OrderedDict([
('COMMON', 'Marsh Marigold'),
('BOTANICAL', 'Caltha palustris')]),
OrderedDict([
('COMMON', 'Cowslip'),
('BOTANICAL', 'Caltha palustris')])])])])]))])
我在确定每个字典有多少组时遇到问题,我的尝试如下所示,显示正确的组数为dict2
2,但当dict1
只有一组时显示为答案 3。如果我使用循环打印每个组,dict2
则打印 2 个正确的有序字典,但dict1
打印其他不正确的子节点GROUP
。我做错了什么。
>>> len(dict1['CATALOG']['GROUP'])
3
>>> len(dict2['CATALOG']['GROUP'])
2
>>> dict1['CATALOG']['GROUP'][0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 0
>>>
>>> dict2['CATALOG']['GROUP'][0]
OrderedDict([('ZONE', '3'), ('LIGHT', 'Mostly Shady')...
>>>
>>> dict2['CATALOG']['GROUP'][1] ...
OrderedDict([('ZONE', '4'), ('LIGHT', 'Mostly Sunny')...
>>> ...
>>> for group in dict1['CATALOG']['GROUP']:
... print(group)
...
ZONE
LIGHT
PLANT
>>> for group in dict2['CATALOG']['GROUP']:
... print(group)
...
OrderedDict([('ZONE', '3'), ('LIGHT', 'Mostly Shady')...
OrderedDict([('ZONE', '4'), ('LIGHT', 'Mostly Sunny')...
解决方案
检查是否dictX['CATALOG']['GROUP']
是列表。如果不是列表,则长度为 1。
group1_len = len(dict1['CATALOG']['GROUP']) if isinstance(dict1['CATALOG']['GROUP'], list) else 1
group2_len = len(dict2['CATALOG']['GROUP']) if isinstance(dict2['CATALOG']['GROUP'], list) else 1
如果您首先将字典包装在列表中,它可能会进行所有进一步的处理。然后两个字典将具有相似的结构,您不需要继续使用条件。
for d in (dict1, dict2):
if not isinstance(d['CATALOG']['GROUP'], list):
d['CATALOG']['GROUP'] = [d['CATALOG']['GROUP']]
推荐阅读
- linux - 如果将输出重定向到文件,Linux 进程行为异常 (MQTT)
- c# - Entityframework ObjectContext 刷新更改的实体
- html - 以 Angular 形式显示 img 会给出“具有未指定名称属性的表单控件的无值访问器”
- macos - 软件包名称未显示在我的 pkg 的安装对话框中
- sql - 连接表的 sql 计数
- java - 在 Spring Boot 和 Tomcat 中使用 ObjectBox 作为服务器数据库
- nativescript - Nativescript:嵌套的 RadListView 不保留页面导航上的滚动位置
- android - 媒体播放器无法在 Android API 28 上播放 mp3
- spring - 如何在 Spring Cloud Config 中获取多个分支?
- npm - Laravel 将 SCSS 混合到它自己的 CSS 文件中