2015-04-08 62 views
1

我最近在不使用它幾年後再次選擇了Python來完成一些沒有指定語言要求的學校項目。我目前的項目是使用最大堆結構創建一個簡單的優先級隊列。我目前的問題是與我的輸入文件。對於每一行輸入,我們給出幾個元組,包括:一個字符串(數據)和一個數字(優先級)。Python:逐行閱讀,在每個結束行執行操作

例:

(R10, 10), (R20, 20), (R90, 90), (R75, 75), (R35, 35), (R60, 60), (R260, 60), (R360, 60) 
(R15, 15) 
(R50, 50) 
(R275, 75) 

對於每一個我們需要的信息,每個元組插入到我們的優先級隊列堆和流行,並返回優先級最高,然後重複每行線。

防爆輸出:(它應該是什麼)

*insert all into queue* print (R90) *next line* 
*insert into queue* print (R75) *next line* 
*etc* 

我對究竟如何在數據進入一個形式,我可以與工作相混淆。我目前有這個。

with open(fileName) as f: 
    for line in f.readlines(): 
     nodes = line.split('), (') 

,並返回此:(這是目前我已經得到最接近)

['(R10, 10', 'R20, 20', 'R90, 90', 'R75, 75', 'R35, 35', 'R60, 60', 'R260, 60', 'R360, 60', 'R210, 10', 'R5, 5', 'R76, 76', 'R80, 80)\n'] 
['(R15, 15)\n'] 
['(R50, 50)\n'] 
['(R275, 75)\n'] 

任何幫助,將不勝感激,謝謝提前!

回答

0

我覺得這是最簡單的正則表達式來解決:

import re 
# This regular expression will match '(<group1>,<group2>)' 
# with any whitespace between ',' and <group2> being discarded 
tuple_pattern = tuple_pattern = re.compile("\(([^,)]+),\s*([^)]+)\)") 

with open(fileName) as f: 
    # Find all occurences of the tuple pattern in the file, this gives 
    # us an array of tuples where each tuple is (<group1>,<group2>) 
    # for each match 
    tuples = tuple_pattern.findall(f.read()) 

與您輸入的數據是這樣的結果:

>>> tuple_pattern.findall("""(R10, 10), (R20, 20), (R90, 90), (R75, 75), (R35, 35), (R60, 60), (R260, 60), (R360, 60) 
... (R15, 15) 
... (R50, 50) 
... (R275, 75)""") 
[('R10', '10'), ('R20', '20'), ('R90', '90'), ('R75', '75'), ('R35', '35'), ('R60', '60'), ('R260', '60'), ('R360', '60'), ('R15', '15'), ('R50', '50'), ('R275', '75')] 

編輯:

如果您需要處理每個行分開,只需做tuple_pattern.findall(line)file.readlines()

import re 
tuple_pattern = re.compile("\(([^,)]+),\s*([^)]+)\)") 

with open(filename) as f: 
    for line in f.readlines(): 
     print(tuple_pattern.findall(line)) 

輸出:

[('R10', '10'), ('R20', '20'), ('R90', '90'), ('R75', '75'), ('R35', '35'), ('R60', '60'), ('R260', '60'), ('R360', '60')] 
[('R15', '15')] 
[('R50', '50')] 
[('R275', '75')] 
+0

你能解釋一下到底什麼是與此代碼發生?瞭解它的工作原理將對未來非常有幫助。此外,這會切斷號碼的第一位;有沒有辦法解決這個問題? – Michael

+0

我修正了正則表達式 - +在最後括號的錯誤一側。 – Raniz

+0

這裏發生的事情是,我們創建一個匹配元組的正則表達式並捕獲其中的第一個和第二個值。 findall()然後將此模式儘可能多次應用於輸入字符串,並返回所有捕獲的所有匹配組的列表。 – Raniz