Разделить элементы списка на несколько категорий [закрыто]Python

Программы на Python
Ответить
Anonymous
 Разделить элементы списка на несколько категорий [закрыто]

Сообщение Anonymous »

Мне нужен совет о том, является ли следующий подход хорошим? Можно ли написать более производительно?
У меня есть список групп, которые я хотел бы классифицировать на основе нескольких критериев, а элементы могут удовлетворять нескольким критериям и, таким образом, оказаться в несколько групп.
Я создал эту функцию, чтобы разделить их:

Код: Выделить всё

def categorize_multi(groups:Iterable[T], categories:list[Callable[[T], bool]])->tuple[list[T],...]:
'''Split a list into multiple categories.  Elements of the list can be in multiple categories if they satisfy multiple categories.
'''
def categorize(groups:Iterable[T])->Iterator[tuple[int, T]]:
for group in groups:
for group_num, category in enumerate(categories):
if category(group):
yield group_num, group
rv:defaultdict[int, list[T]] = 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])
categorize_multi всегда возвращает кортеж длиной, определяемой количеством категорий.
Пока это работает.
Я использую его в коде бота, который играет в Starcraft 2, поэтому я стремлюсь минимизировать время, необходимое для распределения вражеских юнитов по различным необходимым мне группам.
Я знаю, что подсказки типов — это беспорядок, поэтому любые предложения тоже был бы признателен. Я пытаюсь улучшить свой Python в целом и то, как я его повторяю.

Подробнее здесь: https://stackoverflow.com/questions/793 ... categories
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»