在Python中使用groupby方法,附带示例

1 投票
4 回答
4081 浏览
提问于 2025-04-15 21:08

我正在尝试使用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 循环。

撰写回答