2012-06-20 4 views
0

내가 파이썬 안돼서을 사용하여 파일에서 라인을 선택하고 내가 도움이 필요하십니까 : 나는이 같은 라인 (아래 참조)를 가진 파일이는 특정 조건

합니다. 이 파일에서 행을 복사하고 일부 행의 날짜가 유사하므로 줄의 날짜가 비슷한 경우 목록 끝 번호의 값이 가장 작은 행을 선택하려고합니다. 첫째

'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

일부 코드 : 나는있는 StringIO 객체를 코드에서 텍스트를 넣어 포장 한

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 

는 파일을 에뮬레이션 할 수 있지만, 일반적으로 사람은 CSV를 사용하여 텍스트를 열 것입니다. open()을 사용하여 파일을 읽습니다.

그런 다음 데이터는 데이터 열 (인덱스 0)과 값 열 (인덱스 2)로 정렬됩니다.이 정렬 순서에 따라 동일한 날짜가 함께 사용됩니다 ('비슷한'을 언급했음을 알지만이 제조법은 각 날짜에 대해 가장 낮은 값의 열이 먼저 나타납니다.

itertools.groupby()는 특정 조건과 일치하는 키를 반복하는 데 사용됩니다. 즉, 조건을 충족하는 키는 동일한 "그룹"에 있습니다. 'key'(그룹화되는 항목)는 날짜 값이고 'val'은 해당 키 내에서 사용 가능한 값의 또 다른 반복 가능 항목입니다. 첫 번째 만 필요하기 때문에 next (val)를 사용하면 결과가 가장 작은 값으로 반환됩니다.

출력은 다음과 같습니다

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

나는이 솔루션을 적용하려하지만 for 루프를 사용하여 행에 의해 CSV 파일의 행 읽기 때문에, 나는리스트의 목록을 만들 수있는 방법을 찾을 수 있도록 나는 그것을 분류 할 수있다. csv 파일에서 읽는 것이면 어떻게 될지 알려주시겠습니까? –

+0

죄송합니다 - 이해가 안됩니다 - 목록이 이미 정렬되어 있습니다 - 좀 더 구체적으로 기재 해주십시오. –

+0

나는하려고 : myInput = csv.reader (open (path)), 다음 줄 단위로 읽습니다 : for myInput : tableular = list (line), 여기서부터 사용하려고 정렬 : tabular.sort (key = lambda L : groupby (tabular, itemgetter (0))의 키 : val의 경우 : 다음 인쇄 (val) –