首页 > 解决方案 > 如何在有序字典中获得正确数量的子元素?

问题描述

我有以下 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')])])])])]))])

结构是这样的: 在此处输入图像描述

我在确定每个字典有多少组时遇到问题,我的尝试如下所示,显示正确的组数为dict22,但当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')...

标签: pythonordereddictionary

解决方案


检查是否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']]

推荐阅读