一些代码第一:
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文本。读者在使用open()的文件上。
然后数据按数据列(索引0)和值列(索引2)排序 - 这种排序顺序确保相同的日期在一起(我意识到你提到'相似',但这个配方可以是适应),并且对于每个日期,最低值列首先出现。
itertools.groupby()用于遍历符合某些条件的键 - 它们符合条件时,它们位于同一个“组”中。 'key'(分组的内容)将是日期的值,'val'将是该键中可用值的另一个迭代。由于只需要第一个,所以使用next(val)将返回最小值的结果。
输出是:
['1990-01-01', 'j', '1.5']
['1990-01-02', 'b', '3.9']
我尝试着将这个解决方案,但因为我使用循环CSV文件中的行读取行,我不能找到一种方法,使一个列表的列表,以便我可以对它进行分类。你会告诉我,如果是从csv文件读取这将是如何? –
对不起 - 我不明白 - 列表已经排序 - 请问您能更具体吗? –
我试着做:myInput = csv.reader(open(path)),然后我一行一行读取:for line in myInput:tabular = list(line),从这里我试着用tabular.sort(key = lambda L:(L [0],float(L [2])),继续:对于groupby(表格,itemgetter(0))中的key,val: print next(val) –