在Python中使用groupby方法,包括示例

时间:2010-04-02 01:36:29

标签: python

尝试使用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日创建的。我哪里错了?

4 个答案:

答案 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']}

不涉及排序或花哨的迭代器。