Python:根据一些标准获取数组并将其分解为子数组

时间:2010-04-01 22:04:49

标签: python

我有一个文件数组。我希望能够将该数组拆分为具有多个子数组的一个数组,每个子数组包含在同一天创建的文件。所以现在如果数组包含3月1日到3月31日的文件,我想要一个包含31个子数组的数组(假设每天至少有> 1个文件)。

从长远来看,我正在尝试使用最新的创建/修改时间来查找每天的文件。如果有办法将其捆绑到上面需要的迭代中以节省一些CPU周期,那将更加理想。然后我会有一个包含31个文件的平面数组,每天一个,用于每个日创建的最新文件。

我当前的数据结构只是一个文件名列表。

3 个答案:

答案 0 :(得分:5)

如果您需要按某些条件将列表拆分为列表列表,请查看itertools.groupby()

答案 1 :(得分:3)

要获取每天具有最新时间戳的文件,请使用带有日期作为键的dict和(filename,timestamp)元组作为值。循环遍历所有文件,如果dict时间戳小于当前文件,或者当天没有值,则更新当天的dict值。

答案 2 :(得分:2)

跟进Messa的回答,如果您的结构如下:

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])。