"""稳定证券键、边界优先保留与输入重排;全排列验收。""" import itertools import json scores = {'A': 5, 'B': 4, 'C': 4, 'D': 4, 'E': 1} held = {'A', 'C'} def select(items, retain): return [s for s, value in sorted(items, key=lambda item: (-item[1], item[0] not in held if retain else False, item[0]))[:2]] for perm in itertools.permutations(scores.items()): assert select(perm, True) == ['A', 'C'] assert select(perm, False) == ['A', 'B'] naive1 = sorted(scores.items(), key=lambda x: -x[1])[:2] naive2 = sorted(reversed(list(scores.items())), key=lambda x: -x[1])[:2] assert [r[0] for r in naive1] != [r[0] for r in naive2] assert select([('A', 5), ('B', 4), ('C', 3), ('D', 4), ('E', 1)], True) == ['A', 'B'] assert select([(s, v) for s, v in scores.items() if s != 'C'], True) == ['A', 'B'] retained_cash, id_cash = 200, 200 + 400 - 1 - 400 - 1 assert retained_cash + 800 == 1000 and id_cash + 800 == 998 print(json.dumps({'retain': select(scores.items(), True), 'identifier_only': select(scores.items(), False), 'permutations_checked': 120, 'retain_equity': 1000, 'identifier_equity': 998, 'identifier_orders': [['C', 'sell', 40, 10, 1], ['B', 'buy', 40, 10, 1]], 'naive_original': naive1, 'naive_reversed': naive2}))