尝试使用groupby,以便我可以将在同一天创建的文件组合在一起。当我在这种情况下说同一天时,我的意思是dd部分,单位为mm / dd / yyyy。因此,如果文件是在3月1日和4月1日创建的,则应将它们组合在一起,因为“1”匹配。这是我到目前为止的代码:
#!/usr/bin/python
import os
import datetime
from itertools import groupby
def created_ymd(fn):
ts = os.stat(fn).st_ctime
dt = datetime.date.fromtimestamp(ts)
return dt.year, dt.month, dt.day
def get_files():
files = []
for f in os.listdir(os.getcwd()):
if not os.path.isfile(f): continue
y,m,d = created_ymd(f)
files.append((f, d))
return files
files = get_files()
for key, group in groupby(files, lambda x: x[1]):
for file in group:
print "file: %s, date: %s" % (file[0], key)
print " "
问题是,我收到很多根据当天组合在一起的文件。但后来我会在同一天看到多个小组。意思是我可能有4个文件分组在17日创建。稍后我将看到另一组独特的2个文件,这些文件也是在17日创建的。我哪里错了?
答案 0 :(得分:2)
groupby()
都会生成一个新组,这意味着您必须先对数据进行排序,以便将所有类似的元素组合在一起。试试这个:
files = sorted(get_files(), key=(lambda x: x[1]))
然后运行for
循环。
答案 1 :(得分:1)
您要向groupby
提供的列表需要按照您所要求的方式进行排序,在本例中为dd
。
答案 2 :(得分:0)
引用docs:“通常,迭代需要已经在相同的键函数上排序。”
grouping = lambda x: x[1]
files.sort(key=grouping)
for key, group in groupby(files, grouping):
...
答案 3 :(得分:0)
听起来你不需要标准itertools中找到的groupby
的流媒体特性。在toolz
library中实现了非流媒体groupby
。
$ pip install toolz
$ python
>>> from toolz import groupby
>>> names = ['Alice', 'Bob', 'Charlie', 'Dan', 'Edith', 'Frank']
>>> groupby(len, names)
{3: ['Bob', 'Dan'], 5: ['Alice', 'Edith', 'Frank'], 7: ['Charlie']}
不涉及排序或花哨的迭代器。