私は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'
私は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'
最初にいくつかのコード:
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']