0

我是 Python 新手,需要帮助:

我有一个包含这些行的文件(见下文)。我想从此文件中复制行,并且由于某些行具有相似的日期,如果行具有相似的日期,我想选择具有最小值的行结束列表。

'1990-01-01','f','2'
'1990-01-02','c','4'
'1990-01-01','j','2.5'
'1990-01-01','j','1.5'
'1990-01-02','b','3.9'
4

1 回答 1

1

先上一些代码:

text_data = """'1990-01-01','f','2'
'1990-01-02','c','4'
'1990-01-01','j','2.5'
'1990-01-01','j','1.5'
'1990-01-02','b','3.9'
"""

import csv
from StringIO import StringIO
from operator import itemgetter
from itertools import groupby


temp = StringIO(text_data)
tabular = list(csv.reader(temp, quotechar="'"))
tabular.sort(key=lambda L: (L[0], float(L[2]))

for key, val in groupby(tabular, itemgetter(0)):
    print next(val) # or do something appropriate

我已将文本放入代码中并将其包装在 StringIO 对象中以模拟文件,但通常人们会使用 csv.reader 在使用 open() 的文件上打开文本。

然后数据按数据列(索引 0)和值列(索引 2)排序 - 这种排序顺序确保相同的日期在一起(我意识到你提到了“相似”,但这个配方可以调整)并且对于每个日期,最低值列首先出现。

itertools.groupby() 用于迭代匹配某些条件的键——当它们满足该条件时,它们在同一个“组”中。'key' (分组依据)将是日期的值,而 'val' 将是该键中可用值的另一个可迭代。由于只需要第一个,因此使用 next(val) 将返回具有最小值的结果。

输出是:

['1990-01-01', 'j', '1.5']
['1990-01-02', 'b', '3.9']
于 2012-06-20T17:59:26.437 回答