在Python中使用groupby方法,附带示例
我正在尝试使用groupby功能,把在同一天创建的文件归为一组。这里说的同一天,指的是日期中的“日”部分,也就是mm/dd/yyyy格式中的dd部分。所以如果一个文件是在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号创建的。我哪里出错了呢?
4 个回答
0
根据文档的说法:“通常,迭代的对象需要先按照相同的关键函数进行排序。”
grouping = lambda x: x[1]
files.sort(key=grouping)
for key, group in groupby(files, grouping):
...
1
你传给 groupby
的列表需要先排序,不管你是根据什么来分组,在这个例子中是根据 dd
来分组的。
2
groupby()
函数每当关键字变化时就会生成一个新的组,这意味着你必须先对数据进行排序,才能把所有相似的元素放在一起。你可以试试这样做:
files = sorted(get_files(), key=(lambda x: x[1]))
然后再运行你的 for
循环。