У меня есть список групп, которые я хотел бы классифицировать на основе нескольких критериев, а элементы могут удовлетворять нескольким критериям и, таким образом, оказаться в несколько групп.
Я создал эту функцию, чтобы разделить их:
Код: Выделить всё
def categorize_multi(groups:list, categories:list[Callable])->Iterator[tuple[int, Any]]:
def categorize(group:Any)->Iterator[tuple[int, Any]]:
for group in groups:
for group_num, category in enumerate(categories):
if category(group):
yield group_num, group
rv = defaultdict(list)
for key, values in it.groupby(sorted(categorize(groups), key=op.itemgetter(0)), key=op.itemgetter(0)):
rv[key] = list(val[1] for val in values)
return tuple((rv[key] for key in range(len(categories))))
Код: Выделить всё
group_center_in_defend_zone = lambda group: group.center.distance_to(self.natural_defend_midpoint) < 30 and self.ai.pathing_manager.influence_maps[IMType.ZONES][group.center] not in {0,1}
group_air_only = lambda group: group.power.air_power > 0 and group.power.ground_power == 0
enemy_power_outside_natural, air_only_harass_groups_near_bases = categorize_multi(self.ai.combat.enemy_groups, [group_center_in_defend_zone, group_air_only])
Пока это работает.
Я использую его в коде бота, который играет в Starcraft 2, поэтому я стремлюсь минимизировать время, необходимое для распределения вражеских юнитов по различным необходимым мне группам.
Я знаю, что подсказки типов — это беспорядок, поэтому любые предложения тоже был бы признателен. Я пытаюсь улучшить свой Python в целом и то, как я его повторяю.
Подробнее здесь: https://stackoverflow.com/questions/793 ... categories
Мобильная версия