【问题标题】:Multidimensional List/Dict/whatever?多维列表/字典/什么?
【发布时间】:2012-01-09 19:30:37
【问题描述】:

我想在 Python 中创建一个多维数组,以便稍后对其进行解析。我是 PHP 的切换器,所以我对如何创建字典或列表或其他任何东西来以这种方式获取数据有点困惑。有人有想法吗?

for group, value in data:
    print '%s = %s' % (group, value)
    for member, value in group:
        print '   MEMBER: %s = %s' % (member, value)

>> 'Windows = 12%'
>> '   MEMBER: pc1 = 123'
>> '   MEMBER: pc2 = 321'
>> 'MacOS = 11%'
>> 'Linux = 13%'
>> '   MEMBER: pc3 = 213'
>> '   MEMBER: pc4 = 132'
>> ...

【问题讨论】:

    标签: python list dictionary multidimensional-array arraylist


    【解决方案1】:

    您可以创建一个递归列表或 dict 来实现它,我更喜欢 dict 因为您可以命名变量,例如

    mydata = [
        {
            'name': 'Windows',
            'value': '12%',
            'members': [
                {
                    'name': 'pc1',
                    'value': 123,
                    'members': []
                },
                {
                    'name': 'pc2',
                    'value': 321,
                    'members': []
                },
            ]
        },
        {
            'name': 'Linux',
            'value': '11%',
            'members': [
                {
                    'name': 'pc3',
                    'value': 213,
                    'members': []
                },
                {
                    'name': 'pc4',
                    'value': 132,
                    'members': []
                },
            ]
        },
    ]
    

    现在如果你知道你的数据结构只有 1 级深度,你可以像这样迭代它

    for topmember in mydata:
        print "%s = %s"%(topmember['name'], topmember['value'])
        for member in topmember['members']:
            print '   MEMBER: %s = %s' % (member['name'], member['value'])
    

    输出:

    Windows = 12%
       MEMBER: pc1 = 123
       MEMBER: pc2 = 321
    Linux = 11%
       MEMBER: pc3 = 213
       MEMBER: pc4 = 132
    

    但如果你不知道它有多深,例如成员可以进一步拥有更多成员,以此类推,您可以递归地遍历它,例如

    def print_recursive(members, indent=''):
        for member in members:
            print "%s%s = %s"%(indent, member['name'], member['value'])
            print_recursive(member['members'], indent + '    ')
    
    print_recursive(mydata)
    

    输出:

    Windows = 12%
        pc1 = 123
        pc2 = 321
    Linux = 11%
        pc3 = 213
        pc4 = 132
    

    【讨论】:

      【解决方案2】:

      还要考虑 lambda 增强的 defaultdict 的强大功能!
      这会生成一个准备好填充项目列表的三维网格:

      >>> from collections import defaultdict
      >>> data = defaultdict(lambda:defaultdict(lambda:defaultdict(list)))
      >>> data['1stD']['2ndD']['3thrD'].append('mivalue')
      >>> print data['1stD']['2ndD']['3thrD']
      ['mivalue']
      >>> print data['1stD']['2ndD']['unknown']
      []
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2018-07-24
        • 2014-01-30
        • 2019-07-10
        • 2012-11-19
        • 1970-01-01
        相关资源
        最近更新 更多