2014-03-06 3 views
0

예 입력 파일을 만족하는 인덱스의 선택 범위 :파이썬 : 조건

index score 
1  0.2 
3  0.4 
7  1.5 
13  1.8 
22  1.9 
25  1.6 
30  0.5 
31  0.2 
43  1.5 
45  1.6 
50  0.3 
61  0.1 

내가하고 싶은 무언가를 생산 어디에 있는지에 대한 점수> = 1 인쇄이 지역의 최소 및 최대 인덱스 이런 동일한 행 :

min  max 
7  25 
43  45 

는 I 번째 요소> = 1이면 검사 while 루프 내부의 입력 라인을 분할 루프를 사용하려고했지만, I 자신 혼란 얻고있다. 어떤 도움이라도 대단히 감사합니다. 고맙습니다!

여기 내 시도하지만 그것을 분할 전에 분할 선을 호출하기 때문에 그것은 바보 :

while lp[1] >= 1: 
    for line in file: 
    lp = line.split() 
      if lp[1] >= 1: 
      print(lp[0]) 
+4

우리가 정확히 어디에서 붙어 있는지 알 수 있도록 시도를 포함 시키십시오. – mhlester

답변

0
lines = [] 
with open("this_file.txt", "r") as f: 
    for l in f.readlines()[1:]: 
     a, b = l.split() 
     lines.append((int(a), float(b)) 
bigger_than_one = [ pair for pair in lines if pair[1]>=1. ] 
print("min", *min(bigger_than_one, key= lambda x: x[1])) 
print("max", *max(bigger_than_one, key= lambda x: x[1])) 

테스트되지 않은,하지만 당신은 아이디어를 얻을 것이다.

1

이 작업을 수행하는 쉬운 방법은 itertools.groupby를 사용하는 것입니다 : 물론

from itertools import groupby 
with open('abc1') as f: 
    for k, g in groupby(f, key=lambda x:float(x.split()[1]) >= 1): 
     if k: 
      minn = next(g) 
      for maxx in g: pass 
      print minn, maxx 
...    
7  1.5 
25  1.6 

43  1.5 
45  1.6 

는 위의 코드는 해결하기 위해 나는 떠날거야, 범위는 길이가 1 인 경우에는 작동하지 않습니다.

0

둘 다 감사합니다. 나는 당신의 대답을 조사하면서 뭔가를 배웠습니다. 나는 이것을 작성했다 :

previousScore = 0 
previousID = "" 
offpeak = True 

for line in file: 
     lp = line.split() 
     if float(lp[1]) >= 1 and offpeak: 
       print(lp[0]) 
       offpeak = False 
     if float(lp[1]) <= 1 and previousScore >=1: 
       print(previousID) 
       offpeak = True 
     previousScore = float(lp[1]) 
     previousID = lp[0]