Найти - Пользователи
Полная версия: Перегруппировать одномерный список словарей в многомерный
Начало » Python для новичков » Перегруппировать одномерный список словарей в многомерный
1
martin
Как перегруппировать одномерный массив в многомерный, по определенным параметрам (уникальный 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'},
                        ]
                    }
                ]
            }
        ]
    }
]
Iskatel
martin
Как перегруппировать одномерный массив в многомерный, по определенным параметрам (уникальный device, затем уникальный type, затем уникальный ip, и потом уже информацию file и date)?то есть из этого:
Ну как, как… Программу писать надо…
doza_and
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'}]}}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB