Сортировка динамических данных с несколькими параметрами и их равномерное распределение в python dango
Я хочу отсортировать список пользователей на основе некоторых параметров поля и распределить их по списку в равной степени, я пытаюсь сделать автоматизированный способ помочь школам распределить учеников по классам как часть большей системы.
Разъяснение функциональности:
Предположим, что есть 100 учеников, зарегистрированных в 4 классе, и внутри класса есть 4 секции{A, B, C, D}, когда функция запущена, я хочу взять всех учеников, зарегистрированных в 4 классе, и поместить их в список, после чего функция должна пройтись итерацией по списку и попытаться (потому что там будут тесно связанные значения и, возможно, не совсем похожие) равномерно распределить их по 4 спискам (количество секций) или напрямую сохранить их с соответствующим экземпляром секции, эффект должен в некотором роде напоминать магнит, в котором сходства отталкивают друг друга, а различия притягивают, пока списки не будут уточнены до наилучшего, на что они способны.
это не большая проблема, если метод медленный, потому что не будет много студентов в одном списке, так как он будет выполняться на уровне класса, пожалуйста, укажите мне на ресурс, поделитесь сниппером или объясните, как я могу это реализовать. 5 студентов:
Student-1:{
age:12,height:1.2m, sex:MALE
}
Student-2:{
age:11,height:1.2m, sex:FEMALE
}
Student-3:{
age:13,height:1.3m, sex:MALE
}
Student-4:{
age:11,height:1.24m, sex:FEMALE
}
Student-5:{
age:13,height:1.2m, sex:MALE
}
expected outPut:
section-1:{
Student-1,
Student-3
}
section-2:{
Student-5,
Student-4
}
section-3:{
Student-2
}
поэтому если сходств больше, чем различий, т.е. Similar:{age = True, height=True, sex=False}
== similarities > difference
, и в целом они более похожи по сравнению с другими экземплярами, их следует поместить в следующий класс
заранее большое спасибо
вам нужно написать функцию "веса", основанную на атрибутах, которые у вас есть - и затем настроить ее на вес, который вы хотите для каждого атрибута. Затем отсортируйте всех, используя эту функцию "веса", так, чтобы похожие были ближе всего (обратное тому, что вы хотите).
После того, как вы попали туда, вы разрезаете полученный список со всеми студентами, так что первый находится в A, второй - в B, и так далее.
Это кажется наиболее разумным способом - иначе вы можете получить крайние значения в одной группе, например, самого высокого и самого низкого студента в одной группе, всегда.
Весовая функция может быть примерно такой:
import statiscs
import itertools
def studens_in_grade(students):
average_height = statistics.median(student.height for student in students)
def weight(student):
gender = 100 if student.gender == "female" else 0
height = 30 * (student.height - average_height)
...
return gender + height + ....
students.sort(key=weight)
groups = {}
for group, student in zip(itertools.cycle("ABCD"), students):
groups.setdefault(group, []).append(student)
return groups