2012-06-20 78 views
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' 

回答

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文本。读者在使用open()的文件上。

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

itertools.groupby()用于遍历符合某些条件的键 - 它们符合条件时,它们位于同一个“组”中。 'key'(分组的内容)将是日期的值,'val'将是该键中可用值的另一个迭代。由于只需要第一个,所以使用next(val)将返回最小值的结果。

输出是:

['1990-01-01', 'j', '1.5'] 
['1990-01-02', 'b', '3.9'] 
+0

我尝试着将这个解决方案,但因为我使用循环CSV文件中的行读取行,我不能找到一种方法,使一个列表的列表,以便我可以对它进行分类。你会告诉我,如果是从csv文件读取这将是如何? –

+0

对不起 - 我不明白 - 列表已经排序 - 请问您能更具体吗? –

+0

我试着做: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) –

相关问题