2014-03-06 78 views
0

例輸入文件索引的選擇範圍:的Python:滿足以下條件

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 

我試圖用一個for循環while循環來檢查,如果第二元件是> = 1內的輸入線裂開,但我發現我自己感到困惑。任何幫助不勝感激。謝謝!

這裏是我的嘗試,但由於它會調用分割線它分裂之前,這是愚蠢的:

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]