Python: Взятие массива и разбиение его на подмассивы на основе некоторых критериев - PullRequest
1 голос
/ 02 апреля 2010

У меня есть массив файлов. Я хотел бы иметь возможность разбить этот массив на один массив с несколькими подмассивами, каждый из которых содержит файлы, созданные в один и тот же день. Итак, прямо сейчас, если массив содержит файлы с 1 по 31 марта, я хотел бы иметь массив с 31 подмассивом (при условии, что на каждый день имеется не менее 1 файла).

В долгосрочной перспективе я пытаюсь найти файл из каждого дня с последним временем создания / изменения. Если есть способ объединить это в итерации, которые требуются выше, чтобы сохранить некоторые циклы ЦП, это было бы еще более идеальным. Тогда у меня будет один плоский массив с 31 файлом, по одному на каждый день, для последнего файла, созданного в каждый отдельный день.

Моя текущая структура данных - это просто список имен файлов.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2010

Если вам нужно разделить список на списки списков по некоторым критериям, взгляните на itertools.groupby () .

3 голосов
/ 02 апреля 2010

Чтобы получить файлы с самыми последними отметками времени для каждого дня, используйте dict с днями в качестве ключей и кортежей (имя файла, отметка времени) в качестве значений. Переберите все файлы и обновите значение dict для этого дня, если временная метка dict меньше текущего файла, или если для этого дня еще нет значения.

2 голосов
/ 02 апреля 2010

Отслеживание ответа Мессы, если ваша структура похожа на:

files=[{'date': datetime(2010, 3, 1, 0, 0, 10), 'file': 'foo'}, 
       {'date': datetime(2010, 3, 1, 12, 0, 10), 'file': 'bar'}, 
       {'date': datetime(2010, 3, 2, 3, 5, 10), 'file': 'baz'}, 
       {'date': datetime(2010, 3, 2, 3, 3, 10), 'file': 'foo'}]

попробуйте что-то вроде:

from itertools import groupby
map(lambda x: next(x[1]), 
    groupby(sorted(files, 
                   key=lambda x: x['date'],
                   reverse=True), 
         key=lambda x: datetime(x['date'].year, x['date'].month, x['date'].day)))

, который даст вам:

[{'date': datetime.datetime(2010, 3, 2, 3, 5, 10), 'file': 'baz'}, {'date': datetime.datetime(2010, 3, 1, 12, 0, 10), 'file': 'bar'}]

По сути, сначала выполняется сортировка по дате в обратном порядке (sorted), затем группировка по дате (groupby), а затем первый элемент каждой группы (next[1]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...