"""合成硬过滤与软排序;权重不能救回不合格行。""" import json from decimal import Decimal as D rows = [ {"symbol": "AAA", "turnover": 3, "value_rank": 1, "growth_rank": 3}, {"symbol": "BBB", "turnover": 4, "value_rank": 3, "growth_rank": 1}, {"symbol": "CCC", "turnover": 1, "value_rank": 1, "growth_rank": 1}, {"symbol": "DDD", "turnover": 3, "value_rank": 2, "growth_rank": 2}, {"symbol": "EEE", "turnover": 3, "value_rank": None, "growth_rank": 1}, ] def rank(weight): eligible = [r for r in rows if r["turnover"] >= 2] scored = [] pending = [] for row in eligible: if row["value_rank"] is None or row["growth_rank"] is None: pending.append(row["symbol"]) continue score = weight * D(row["value_rank"]) + (1 - weight) * D(row["growth_rank"]) scored.append((score, row["symbol"])) return sorted(scored), pending value_first, pending = rank(D("0.75")) growth_first, _ = rank(D("0.25")) assert [s for _, s in value_first] == ["AAA", "DDD", "BBB"] assert [s for _, s in growth_first] == ["BBB", "DDD", "AAA"] assert "CCC" not in [s for _, s in growth_first] ties, _ = rank(D("0.5")) assert ties == [(D("2.0"), "AAA"), (D("2.0"), "BBB"), (D("2.0"), "DDD")] assert pending == ["EEE"] print(json.dumps({"value_first": [[str(n), s] for n, s in value_first], "growth_first": [[str(n), s] for n, s in growth_first], "top_two": [s for _, s in value_first[:2]], "pending": pending}))