2011-11-30 66 views
0

我想在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' 
>> ... 

回答

5

您可以創建一個遞歸列表或字典來實現它,我寧願字典,你可以如命名變量

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 
+0

你先生......是一個傳奇。非常感謝! – Thomas

+0

@ user1073606,歡迎您:) –

0

也考慮到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'] 
[]