2012-07-18 62 views
0

我有一个脚本,用于创建certian系列子目录中所有pdf的目录列表。输出是元组,其中包括保存为一个字符串,以及对设备的ID生成,看起来像下面的报告文件的年份:从子列表中提取最大项目的元组(在目录中查找最新报告)

unit1, 2010 
unit2, 2002 
unit2, 2005 
unit2, 2010 
unit3, 2003 

我正在寻找现在要做的是创建一个报告,根据第二个项目中包含最大值的元组找到最近的报告。通常情况下,我会使用MAX查询在Access中执行此操作,但是,我尝试从此步骤开始缩小该步骤,并一次性写入提取。用我的原单的代码,我的输出将包括以下内容:

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] 

这将返回只匹配前南的最大而不是每个子表每前南的最大的元组。

编辑

使用mglison的第一个答案,我是能够得到输出(包含具有最大值第二项元组)。

+0

@selllikesybok感谢 – mburkenysdot 2012-07-18 16:30:03

+0

我已经编辑再此要尽量使问题更加清楚一点:我喜欢用打印验证的东西之前,我担心书面方式将结果文件,但该意味着偶尔我可能会有点失落。如果我在结果之间传递结果,那么只关注其中的一个并不是一个好主意。 – mburkenysdot 2012-07-19 12:45:45

回答

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 
+0

我想我不明白第二行通过子列表的迭代是如何工作的。 – mburkenysdot 2012-07-18 19:12:02

+0

@mburkenysdot - 对不起。我不明白你的问题。你能再试一次吗? – mgilson 2012-07-18 19:13:39

+0

@mburkenysdot - 我已经更新了我的答案。我不太清楚你想做什么,但我猜。让我知道这是否有效。 – mgilson 2012-07-18 19:20:36