# -*- coding: utf-8 -*- """统计各系列"参数组合 → 型号"是否一对一 (多处多 vs 一处多)。""" import json, io, collections CAT = r'D:/开发/OnebotCatalog/release/web_2026.08/catalog.json' d = json.load(io.open(CAT, encoding='utf-8-sig')) print(f'{"系列":8s} {"变体":>6s} {"组合":>6s} {"重复组":>6s} {"最大一对多":>9s} 判定') print('-' * 58) tot_codes = 0 bad = [] for s in d['series']: vs = s.get('variants') or [] if not vs: continue params = [p['code'] for p in s['parameters']] sig = collections.Counter( tuple(str(v['params'].get(pc)) for pc in params) for v in vs) dup = {k: n for k, n in sig.items() if n > 1} mx = max(sig.values()) if sig else 0 verdict = 'OK 一对一' if not dup else f'!! {len(dup)} 组一对多' if dup: bad.append((s['code'], len(vs), len(dup), mx)) tot_codes += sum(n - 1 for n in dup.values()) print(f'{s["code"]:8s} {len(vs):6d} {len(sig):6d} {len(dup):6d} {mx:9d} {verdict}') print(f'\n存在一对多的系列: {len(bad)} 个, 受影响型号 {tot_codes} 个') if bad: print('\n明细 (系列 / 变体 / 重复组数 / 一组最多几个型号):') for c, n, dup, mx in sorted(bad, key=lambda x: -x[3]): print(f' {c:8s} {n:5d} 变体 {dup:3d} 组 max={mx}')