Предполагая, что у вас есть следующие структуры данных:
student_list = [
{
"student_id": "A01",
"student_name": "Full Name",
"class": "one"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "two"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "three"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "four"
}
]
class_set = {"two", "four"}
Вы можете реализовать вспомогательную функцию student_in_classes
, которая сообщает вам, находится ли ученик в одном из отфильтрованных классов. Если фильтр класса пуст, просто верните всех студентов.
class FilterBase(object):
def __init__(self, filters : set = set()):
self._filters = filters
class StudentFilter(FilterBase):
def __init__(self, class_set : set = set()):
super().__init__(class_set)
def filter_by_class(self, student_data : list):
# No point in filtering if nothing to filter on
return student_data if not self._filters else list(filter(self.student_in_classes, student_data))
# When student's class matches a filter, this will return True
def student_in_classes(self, student_dict : dict):
# Using .get() to handle cases where class isn't provided
return student_dict.get("class", None) in self._filters
Это позволит вам сделать следующее:
sf_no_filter = StudentFilter()
sf_2_filters = StudentFilter(class_set)
print(sf_no_filter.filter_by_class(student_list)) # No filter provided
print(sf_2_filters.filter_by_class(student_list)) # 2 class filters
с выводом
# No Filter Provided
[
{
"student_id": "A01",
"student_name": "Full Name",
"class": "one"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "two"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "three"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "four"
}
]
# Classes "two" and "four" provided
[
{
"student_id": "A01",
"student_name": "Full Name",
"class": "two"
},
{
"student_id": "A01",
"student_name": "Full Name",
"class": "four"
}
]
В зависимости от ваших требований / реализации, может быть более целесообразно, чтобы конструктор использовал и фильтры классов, и список студентов, чтобы вы могли сделать / вызвать простой get_filtered()
для вашего экземпляра StudentFilter
, который возвращает то же самое делает filter_by_class()
.
Кроме того, для именования классов, вероятно, имеет смысл назвать его ClassFilter
вместо StudentFilter
, поскольку классы являются вашими критериями фильтрации stati c за экземпляр.