我有一个文件数组。我希望能够将该数组拆分为具有多个子数组的一个数组,每个子数组包含在同一天创建的文件。所以现在如果数组包含3月1日到3月31日的文件,我想要一个包含31个子数组的数组(假设每天至少有> 1个文件)。
从长远来看,我正在尝试使用最新的创建/修改时间来查找每天的文件。如果有办法将其捆绑到上面需要的迭代中以节省一些CPU周期,那将更加理想。然后我会有一个包含31个文件的平面数组,每天一个,用于每个日创建的最新文件。
我当前的数据结构只是一个文件名列表。
答案 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]
)。