import json,collections TEAMS={} for l in open('teams.tsv').read().strip().split('\n'): p=l.split('\t'); TEAMS[p[0]]=p[1] lines=[l.split('\t') for l in open('China.tsv').read().strip().split('\n')] COMP={'WC':'世界杯','WQ':'世预赛','WQS':'世预赛','AC':'亚洲杯','SQ':'亚预赛','EAH':'东亚杯'} MARGIN=1.07 def num(s): return int(s.replace('−','-')) CUTOFF='2026-10-07' # 数据截止日 FCOMP={'F':'友谊赛','FT':'邀请赛','FFS':'国际足联系列赛'} def make(l, comp): y,m,d,t1,t2,s1,s2,tc,loc,ch,r1a,r2a=l[:12] ch=num(ch); r1=num(r1a)-ch; r2=num(r2a)+ch cn_first = t1=='CN' opp = t2 if cn_first else t1 rc, ro = (r1,r2) if cn_first else (r2,r1) gc, go = (int(s1),int(s2)) if cn_first else (int(s2),int(s1)) # 主场判定 if loc=='' : home = 'CN' if cn_first else opp elif loc=='CN': home='CN' elif loc==opp: home=opp else: home=None ha = 100 if home=='CN' else (-100 if home==opp else 0) dr = rc - ro + ha We = 1/(10**(-dr/400)+1) pD = max(0.05, 0.28 - 0.25*(2*We-1)**2) pW = max(0.01, We*(1-pD)); pL=max(0.01,(1-We)*(1-pD)) s=pW+pD+pL; pW,pD,pL=pW/s,pD/s,pL/s oW = max(1.01, round(1/(pW*MARGIN),2)); oNW = max(1.01, round(1/((pD+pL)*MARGIN),2)); oD=round(1/(pD*MARGIN),2); oL=max(1.01,round(1/(pL*MARGIN),2)) res = 'W' if gc>go else 'D' if gc==go else 'L' return dict(date=f'{y}-{m}-{d}',opp=opp,oppName=TEAMS.get(opp,opp),comp=comp[tc],code=tc,gf=gc,ga=go,res=res,home='H' if home=='CN' else ('A' if home==opp else 'N'),eloC=rc,eloO=ro,pW=round(pW,3),pD=round(pD,3),pL=round(pL,3),oW=oW,oD=oD,oL=oL,oNW=oNW) out=[make(l,COMP) for l in lines if '2002'<=l[0] and l[7] in COMP and f'{l[0]}-{l[1]}-{l[2]}'<=CUTOFF] LAST=out[-1]['date'] # 最后一场正式比赛之后(截至 CUTOFF)的非正式比赛:单独展示,不计入正式结算 extra=[make(l,FCOMP) for l in lines if l[7] in FCOMP and LASTpeak[0]: peak=(bank,o['date']) if bank