Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonre与列表处理_Python - Fatal编程技术网

pythonre与列表处理

pythonre与列表处理,python,Python,我有一个像下面这样的文件 ElapsedTime2.68s: PlaceOrder ElapsedTime2.69s: ClassARestCAll ElapsedTime0.11s: GetOrderList ElapsedTime0.11s: ClassARestCAll ElapsedTime2.10s: PlaceOrder ElapsedTime2.11s: ClassARestCAll ElapsedTime0.10s: GetOrderList ElapsedTime0.10s:

我有一个像下面这样的文件

ElapsedTime2.68s: PlaceOrder
ElapsedTime2.69s: ClassARestCAll
ElapsedTime0.11s: GetOrderList
ElapsedTime0.11s: ClassARestCAll
ElapsedTime2.10s: PlaceOrder
ElapsedTime2.11s: ClassARestCAll
ElapsedTime0.10s: GetOrderList
ElapsedTime0.10s: ClassARestCAll
ElapsedTime2.00s: PlaceOrder
ElapsedTime2.01s: ClassARestCAll
ElapsedTime0.28s: GetOrderList
ElapsedTime0.28s: ClassARestCAll
ElapsedTime1.64s: PlaceOrder
ElapsedTime1.65s: ClassARestCAll
ElapsedTime0.11s: GetOrderList
ElapsedTime0.11s: ClassARestCAll
ElapsedTime1.99s: PlaceOrder
ElapsedTime2.01s: ClassARestCAll
如何解析文件以获得此结果

               average   min   max
ClassARestCAll    1.23   0.1  2.69
GetOrderList      0.15   0.1  0.28
PlaceOrder       2.082  1.64  2.68
我已经开发了一种使用RE和List操作来解决它的方法。 然而,我的方法是为每个新方法名扫描整个列表一次

我们如何通过只扫描一次列表来获取所有API名称的统计信息

import re

def get_stats(N, p_api):
    list_of_rt = []
    for line in N:
        y= re.split("\s+", line)
        if y[1] == p_api:
             curr_rt = float(y[0][11:-2])
             list_of_rt.append(curr_rt)

    min_rt ,max_rt = min(list_of_rt), max(list_of_rt)
    total_rt, total_cnt = sum(list_of_rt), len(list_of_rt)
    print p_api, min_rt, max_rt, "%.3f" %round(total_rt/total_cnt,3), total_cnt


ifile = open('data1.txt','r').read()
api_rts= re.findall(r'ElapsedTime\d*.\d*s: \S*',ifile)


list_of_api_names = []
for api_rt in api_rts:
    y= re.split("\s+", api_rt)
    list_of_api_names.append(y[1])

#get distinct list of API names

distinct_apis = set(list_of_api_names)

print 'api         min,   max,   average,  total occurences'

# for each API name call get_stat

for api in distinct_apis:
    get_stats(api_rts ,api)

你试过什么了吗:3?是的,我试过了。这是我的程序的输出:api最小值、最大值、平均值、总发生次数GetOrderList 0.1 0.28 0.150 4 PlaceOrder 1.64 2.68 2.082 5 ClassAresCall 0.1 2.69 1.230 9您的re.findallr'ElapsedTime\d*\d*s:\s*,如果文件的操作与打开'data1.txt'相同,“r”.readlines或…..readlines.strip``如果每行的开头和结尾都有空格。重新排列的r'ElapsedTime\d*\d*s:\s*'中的点表示“除换行符外的所有字符”。如果您想表示“一点”,则必须写r'ElapsedTime\d*\.\d*s:\s*'
import re, numpy
from collections import defaultdict

data = defaultdict(list)
with open('data1.txt') as f:
    for line in f:
        l =  re.findall('([\d.]+|\w+$)', line)
        data[l[1]].append(float(l[0]))

metrics = [ ['avg', numpy.average], ['min',min], ['max',max] ]
summary = defaultdict(dict)
for k,l in data.items():
    summary[k] = { m[0] : m[1](l) for m in metrics }

print " " * 17 + "\t".join("%-5s" % m[0] for m in metrics)
for k, s in summary.items():
    print "%-15s: " % k + "\t".join("%.3f" % s[m[0]] for m in metrics)
import re

rgx = re.compile('ElapsedTime(\d*\.\d*)s: (\S*)')

from collections import defaultdict
d = defaultdict(list)

with open('data1.txt','r') as f:
    for m in rgx.finditer(f.read()):
        d[m.group(2)].append(float(m.group(1)))

lapi = max(map(len,d.iterkeys()))

print '{: ^{width}}   min    max    average   total occurences'.format('api',width=lapi)
pat = '{0:%d}   {1:.2f}   {2:.2f}   {3:.3f}     {4}' % lapi
print '\n'.join(pat.format(api,min(li),max(li),sum(li)/len(li),len(li))
                for api,li in d.iteritems())