2015-04-08 63 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