import sys,collections sys.stdout.reconfigure(encoding='utf-8') by=collections.defaultdict(list); segs={}; cur=None for l in open('bfoot.txt',encoding='utf-8'): if l.startswith(' seg'): segs.setdefault(cur,[]).append(l.strip()); continue if ' | len ' not in l: continue p=l.strip().split(' | '); nm=p[0]; k=nm.split('-')[2]; cur=k mn=eval(p[2].split('min ')[1]); mx=eval(p[3].split('max ')[1]) by[k].append(dict(nm=nm,len=float(p[1].split()[1]),mn=mn,mx=mx,dl=float(p[4].split()[1]),dia=p[5].split()[1],shape=p[6].split()[1],src=p[7].split('src ',1)[1] if 'src ' in p[7] else '')) tot=0 for k in sorted(by,key=lambda s:int(s[1:])): v=by[k]; f=v[0] xs=[r['mn'][0] for r in v]; ys=[r['mn'][1] for r in v]; zs=sorted({round(r['mn'][2],1) for r in v}); zm=sorted({round(r['mx'][2],1) for r in v}) print('====',k,'n',len(v),'dia',f['dia'],'shape',f['shape'],'design',sorted({r['dl'] for r in v})[:3],'sum %.3f'%(sum(r['dl'] for r in v)/1000)) print(' example',f['nm'],'| src:',f['src'][:150]) print(' X min..max',round(min(r['mn'][0] for r in v)),round(max(r['mx'][0] for r in v)),'| Y',round(min(r['mn'][1] for r in v)),round(max(r['mx'][1] for r in v)),'| Z',round(min(r['mn'][2] for r in v),1),round(max(r['mx'][2] for r in v),1)) ux=sorted({round(r['mn'][0]) for r in v}); uy=sorted({round(r['mn'][1]) for r in v}) print(' unique X-min',len(ux),ux[:6],'..',ux[-3:],' unique Y-min',len(uy),uy[:6],'..',uy[-3:]) for s in segs.get(k,[])[:8]: print(' ',s)