Многомерный список / Dict / что угодно? - PullRequest
0 голосов
/ 30 ноября 2011

Я хотел бы создать многомерный массив в Python, чтобы проанализировать его позже. Я переключаюсь с PHP, поэтому меня немного смущает вопрос о том, как создать dict или список или что-нибудь еще, чтобы вывести эти данные таким образом. У кого-нибудь есть идея?

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'
>> ...

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

Вы можете создать рекурсивный список или 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
0 голосов
/ 30 ноября 2011

Примите также во внимание силу 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']
[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...