2017-04-25 51 views
1

我有文件的集合(有点像CSV,但没有逗号)的数据排列如下所示:枚举列表中的列表元素的

RMS ResNum Scores Rank 
30  1  44  5 
12  1  99  2 
2  1  60  1 
1.5  1  63  3 
12  2  91  4 
2  2  77  3 

我想写枚举脚本对我来说,并给出一个整数作为输出。我希望它能够计算出我们得到的RMS值低于3并且得分高于51的次数。只有满足这两个条件,它才会使我们的计数加1。

然而,棘手的部分是,对于任何给定的“ResNum”,它不能多次添加1次。换言之,我想通过ResNum对数据进行分组,然后根据是否符合这两个条件来决定1或0。

所以现在它会给出一个输出为3,而我希望它显示2代替。由于ResNum 1在此计数两次(两行符合标准)。

import glob 

file_list = glob.glob("*") 
file_list = sorted(file_list) 

for input_file in file_list: 

    masterlist = [] 

    opened_file = open(input_file,'r') 

    count = 0 

    for line in opened_file: 

      data = line.split() 

      templist = [] 

      templist.append(float(data[0]))  #RMS 

      templist.append(int(data[1]))  #ResNum 

      templist.append(float(data[2]))  #Scores 

      templist.append(float(data[3])) #Rank 

      masterlist.append(templist) 

于是,就有了需要修改的部分(我认为)

for placement in masterlist: 

      if placement[0] <3 and placement[2] >51.0: 

        count += 1 

    print input_file 
    print count 
    count = 0 
+0

在您的示例数据中,3行符合条件。 RMS 2,1.5和2(最后一个) –

回答

0

选择你的数据结构仔细使您的生活更轻松。

import glob 

file_list = glob.glob("*") 
file_list = sorted(file_list) 
grouper = {} 
for input_file in file_list: 
    with open(input_file) as f: 
     grouper[input_file] = set() 
     for line in f: 
      rms, resnum, scores, rank = line.split() 
      if int(rms) < 3 and float(scores) > 53: 
       grouper[input_file].add(float(resnum)) 

for input_file, group in grouper.iteritems(): 
    print input_file 
    print len(group) 

这创建了一组字典。这个字典的关键是文件名。这些值是ResNum的集合,仅当您的条件成立时才添加。由于集合没有重复的元素,因此您的集合的大小(len)将会为您提供每个文件符合条件的次数,即每个ResNum