我有一组文件(有点像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 :(得分:0)
仔细选择数据结构,让您的生活更轻松。
options {
...
allow-recursion { all; };
}
这会创建一个集合字典。这本词典的关键是文件名。值是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
满足条件的次数的正确计数。 / p>