Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2015 15:17:33

martin
От:
Зарегистрирован: 2010-10-29
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Перегруппировать одномерный список словарей в многомерный

Как перегруппировать одномерный массив в многомерный, по определенным параметрам (уникальный device, затем уникальный type, затем уникальный ip, и потом уже информацию file и date)?

то есть из этого:

[
    {'device': 'android', 'type': 'xml', 'ip': '198.0.0.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'android', 'type': 'xml', 'ip': '198.0.0.2', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'android', 'type': 'zip', 'ip': '198.0.0.3', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'zip', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'xml', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'xml', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'zip', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'zip', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'xml', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
]
сделать что-то подобное:
[
    {
        'device': 'android',
        'data': [
            {
                'type': 'zip',
                'data': [
                    {
                        'ip': '198.0.0.1',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.2',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.3',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    }
                ]
            },
            {
                'type': 'xml',
                'data': [
                    {
                        'ip': '198.0.0.1',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.2',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.3',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    }
                ]
            }
        ]
    },
    {
        'device': 'osx',
        'data': [
            {
                'type': 'zip',
                'data': [
                    {
                        'ip': '198.0.0.1',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.2',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.3',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    }
                ]
            },
            {
                'type': 'xml',
                'data': [
                    {
                        'ip': '198.0.0.1',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.2',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    },
                    {
                        'ip': '198.0.0.3',
                        'data': [
                            {'file': 'path_to_file1', 'date': '01.02.2015'},
                            {'file': 'path_to_file2', 'date': '02.02.2015'},
                        ]
                    }
                ]
            }
        ]
    }
]



Отредактировано martin (Ноя. 18, 2015 15:17:59)

Офлайн

#2 Ноя. 18, 2015 19:25:39

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Перегруппировать одномерный список словарей в многомерный

martin
Как перегруппировать одномерный массив в многомерный, по определенным параметрам (уникальный device, затем уникальный type, затем уникальный ip, и потом уже информацию file и date)?то есть из этого:
Ну как, как… Программу писать надо…

Офлайн

#3 Ноя. 18, 2015 20:42:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Перегруппировать одномерный список словарей в многомерный

Iskatel
Ну как, как… Программу писать надо…
Подумайте в сторону рекурсивно применить groupby…
from toolz.itertoolz import groupby
from toolz.dicttoolz import valmap
def gbk(arr,keylist):
    if keylist:
        return valmap(lambda x:gbk(x,keylist[1:]),groupby(keylist[0],arr))
    else:
        return arr
###############################
a=[
    {'device': 'android', 'type': 'xml', 'ip': '198.0.0.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'android', 'type': 'xml', 'ip': '198.0.0.2', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'android', 'type': 'zip', 'ip': '198.0.0.3', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'zip', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'xml', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'osx', 'type': 'xml', 'ip': '198.0.2.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'zip', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'zip', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
    {'device': 'pc', 'type': 'xml', 'ip': '198.0.3.1', 'file': 'path_to_file', 'date': '12.02.2015'},
]
>>> gbk(a,['device','type'])
{'android': {'xml': [{'date': '12.02.2015',
                      'device': 'android',
                      'file': 'path_to_file',
                      'ip': '198.0.0.1',
                      'type': 'xml'},
                     {'date': '12.02.2015',
                      'device': 'android',
                      'file': 'path_to_file',
                      'ip': '198.0.0.2',
                      'type': 'xml'}],
             'zip': [{'date': '12.02.2015',
                      'device': 'android',
                      'file': 'path_to_file',
                      'ip': '198.0.0.3',
                      'type': 'zip'}]},
 'osx': {'xml': [{'date': '12.02.2015',
                  'device': 'osx',
                  'file': 'path_to_file',
                  'ip': '198.0.2.1',
                  'type': 'xml'},
                 {'date': '12.02.2015',
                  'device': 'osx',
                  'file': 'path_to_file',
                  'ip': '198.0.2.1',
                  'type': 'xml'}],
         'zip': [{'date': '12.02.2015',
                  'device': 'osx',
                  'file': 'path_to_file',
                  'ip': '198.0.2.1',
                  'type': 'zip'}]},
 'pc': {'xml': [{'date': '12.02.2015',
                 'device': 'pc',
                 'file': 'path_to_file',
                 'ip': '198.0.3.1',
                 'type': 'xml'}],
        'zip': [{'date': '12.02.2015',
                 'device': 'pc',
                 'file': 'path_to_file',
                 'ip': '198.0.3.1',
                 'type': 'zip'},
                {'date': '12.02.2015',
                 'device': 'pc',
                 'file': 'path_to_file',
                 'ip': '198.0.3.1',
                 'type': 'zip'}]}}



Отредактировано doza_and (Ноя. 18, 2015 20:55:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version