0

特定の一連のサブディレクトリ内にすべての pdf のディレクトリ リストを作成するスクリプトがあります。出力は、文字列として保存されたファイルの年と、次のようなレポートを生成したユニットの ID を含むタプルです。

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

私が今探しているのは、2 番目の項目に最大値を含むタプルに基づいて最新のレポートを見つけるレポートを作成することです。通常、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] 

これは、各サブリストごとに fyr の最大値ではなく、fyr の最大値に一致するタプルのみを返します。

編集

mglison の最初の回答を使用して、出力 (最大値を持つ 2 番目の項目を含むタプル) を取得できました。

4

1 に答える 1

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
于 2012-07-18T15:39:19.123 に答える