我有一个脚本,可以在certian系列子目录中创建所有pdf的目录列表。输出是元组,包括保存为字符串的文件年份以及生成报告的单元的ID,如下所示:
unit1, 2010
unit2, 2002
unit2, 2005
unit2, 2010
unit3, 2003
我现在要做的是创建一个报告,根据包含第二个项目中最大值的元组查找最新报告。通常情况下,我会在Access中使用MAX查询执行此操作,但是,我试图将该步骤缩小,并一次性写入提取。使用我的原始代码,我的输出将包含以下内容:
unit1, '2010'
unit2, '2010'
unit3, '2003'
我做了一些环顾四周并意识到我需要更改我的脚本,以便生成一个匹配每个唯一ID的元组列表。使用我从Split a list of tuples into sub-lists of the same tuple field找到的很好的答案我能够将结果分成一组子列表。这意味着我的输出现在如下:
[[(unit1, '2010')],[(unit12, '2010'), (unit2, '2010'), (unit2, '2005'), (unit2, '2002')],[(unit3, '2003']]
我现在的困难是尝试从包含最高价值项的每个子列表中提取元组。我尝试了以下方法:
import glob, os, itertools, operator
dirtup = []
for f in glob.glob('P:\Office*\Technical*\Bureau*\T*\*\YR2*\R*\*\*.pdf'):
fpath, fname = os.path.split(f)
fyr = fpath[91:95]
vcs = 'Volume'
rname, extname = os.path.splitext(fname)
rcid = fname[0:7]
dirtup.append ((f, fyr, rcid, vcs))
dirtup2 = sorted(dirtup, key=operator.itemgetter(2))
for key, group in itertools.groupby(dirtup2, operator.itemgetter(2)):
maxval = max(x[1] for x in dirtup2)
print [x for x in dirtup2 if x[1] == maxval]
这仅返回与fyr的最大值匹配的元组,而不是每个子列表的最大fyr。
修改
使用mglison的第一个答案我能够获得输出(包含最大值的第二项的元组)。
答案 0 :(得分:1)
您可以根据特定字段对每个子列表进行排序,并获取已排序子列表的第一个元素。
for key,group in itertools.groupby(dirtup2,operator.itemgetter(2)):
newlist=sorted(group,key=operator.itemgetter(1),reverse=True)
tuple_with_max=newlist[0]
print tuple_with_max