Python Фильтр с шаблоном оформления для списка - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь отфильтровать данные из списка. Было бы настроить на основе. Так что когда придут изменения - у меня будет возможность внести изменения. У меня есть объект данных как

[
    {
        "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 two and four, а остальным остальным потребуется all data including all classes. У меня есть такой класс:

// Base Class
class FilterBase(object):
    def filter_by_class(self, content):
        pass

// student filter
class StudentFilter(FilterBase):
    def __init__(self, filters=None):
        self._filters = list()
        if filters is None:
            return

    def filter_by_class(self, content):
        for filter in self._filters:
            content = filter(content)
        return content


get_class_two_four = [
      "class": "two",
      "class": "four"
]
default = [] // for default it will return full list

//filtered result 
filter_obj = StudentFilter([
            get_class_two_four
        ])

Как мне получить ожидаемый результат, как это:

[
    {
        "student_id": A01,
        "student_name": "Full Name",
        "class": "two"
    },
    {
        "student_id": A01,
        "student_name": "Full Name",
        "class": "four"
    },
    ....
]

1 Ответ

0 голосов
/ 14 апреля 2020

Предполагая, что у вас есть следующие структуры данных:

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 за экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...