我是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'
答案 0 :(得分: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对象中以模拟文件,但通常可以使用open()在文件上使用csv.reader打开文本。
然后数据按数据列(索引0)和值列(索引2)排序 - 此排序顺序确保相同的日期在一起(我意识到你提到'类似',但这个配方可以调整并且对于每个日期,最低值列首先出现。
itertools.groupby()用于迭代符合某些条件的密钥 - 在符合该条件的条件下,它们位于同一“组”中。 'key'(正在分组的内容)将是日期的值,'val'将是该键中可用值的另一个可迭代值。由于只需要第一个,因此使用next(val)将返回具有最小值的结果。
输出结果为:
['1990-01-01', 'j', '1.5']
['1990-01-02', 'b', '3.9']