<p>如果任务的唯一区别是排名是按升序还是降序排列,那么您实际上不需要两个脚本——只需将其作为函数的参数,如图所示。<code>StrCount</code>类太琐碎了,可能不值得这么做(但我还是把它放在这里了)。在</p>
<pre><code>import csv
from itertools import count, groupby
import sys
_MIN_INT, _MAX_INT = -sys.maxint-1, sys.maxint
RANK_DOWN, RANK_UP = False, True # larger numbers to get higher or lower rank
class StrCount(count):
""" Like itertools.count iterator but supplies string values. """
def next(self):
return str(super(StrCount, self).next())
def rerank(filename, direction):
with open(filename, 'rb') as inf:
reader = csv.reader(inf)
subst = _MIN_INT if direction else _MAX_INT # subst value for empty cells
for dataset, rows in groupby(reader, key=lambda row: row[:2]):
ranking = StrCount(1)
prev = last_rank = None
for row in sorted(rows,
key=lambda row: int(row[2]) if row[2] else subst,
reverse=direction):
row[4] = (ranking.next() if row[2] or not row[2] and prev != ''
else last_rank)
print ','.join(row)
prev, last_rank = row[2], row[4]
if __name__ == '__main__':
print 'CSV example_1.csv (ranked down):'
rerank('example_1.csv', RANK_DOWN)
print '\nCSV example_2.csv (ranked up):'
rerank('example_2.csv', RANK_UP)
print '\nCSV example_3.csv (ranked up):'
rerank('example_3.csv', RANK_UP)
</code></pre>
<p>输出:</p>
^{pr2}$