From 8f0db1384088737a09075adf23ea506c004d929b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=20=D0=9A=D1=80=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= Date: Fri, 7 Apr 2023 21:01:37 +0600 Subject: [PATCH 1/4] lists_exercises --- lists/lists.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/lists/lists.py b/lists/lists.py index 04d850f..f12b78f 100644 --- a/lists/lists.py +++ b/lists/lists.py @@ -8,7 +8,16 @@ def replace(input_list: list[int]) -> list[int]: :param input_list: Исходный список :return: Список с замененными элементами """ - pass + if not input_list: + return input_list + max_value = input_list[0] + for items in input_list: + if items > max_value: + max_value = items + replaced_list = list( + map(lambda replaced: max_value if replaced > 0 else replaced, input_list) + ) + return replaced_list @staticmethod def search(input_list: list[int], query: int) -> int: @@ -20,4 +29,21 @@ def search(input_list: list[int], query: int) -> int: :param query: Искомый элемент :return: Номер элемента """ - pass + if len(input_list) == 0: + return -1 + + mid = len(input_list) // 2 + + if input_list[mid] == query: + return mid + + elif query < input_list[mid]: + return ListExercise.search(input_list[:mid], query) + + else: + new_mid = mid + 1 + result = ListExercise.search(input_list[new_mid:], query) + if result == -1: + return -1 + else: + return mid + 1 + result From 4b89c95914cf3da61755141d0038730a86f1e812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=20=D0=9A=D1=80=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= Date: Fri, 7 Apr 2023 21:11:12 +0600 Subject: [PATCH 2/4] maps_exercises --- maps/maps.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/maps/maps.py b/maps/maps.py index dd5d560..4496f00 100644 --- a/maps/maps.py +++ b/maps/maps.py @@ -13,7 +13,16 @@ def rating(list_of_movies: list[dict]) -> float: Ключи словаря: name, rating_kinopoisk, rating_imdb, genres, year, access_level, country :return: Средний рейтинг фильмов у которых две или больше стран """ - pass + more_2_countries_movies = [] + for movie in list_of_movies: + if ( + movie["rating_kinopoisk"] + and float(movie["rating_kinopoisk"]) != 0 + and len(movie["country"].split(",")) >= 2 + ): + more_2_countries_movies.append(movie) + rating = map(lambda movie: float(movie["rating_kinopoisk"]), more_2_countries_movies) + return sum(rating) / len(list(more_2_countries_movies)) @staticmethod def chars_count(list_of_movies: list[dict], rating: Union[float, int]) -> int: @@ -28,4 +37,9 @@ def chars_count(list_of_movies: list[dict], rating: Union[float, int]) -> int: :return: Количество букв 'и' в названиях всех фильмов с рейтингом больше или равным заданному значению """ - pass + rating_movies = [] + for movie in list_of_movies: + if movie["rating_kinopoisk"] and float(movie["rating_kinopoisk"]) >= rating: + rating_movies.append(movie) + letters = map(lambda movie: movie["name"].count("и"), rating_movies) + return sum(letters) From 4cbdcc90207d9ef7ecbc833832be4e5b78ca3152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=20=D0=9A=D1=80=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= Date: Fri, 7 Apr 2023 21:15:22 +0600 Subject: [PATCH 3/4] filter_map_exercises --- filter_map/filter_map.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/filter_map/filter_map.py b/filter_map/filter_map.py index a27f9ae..35d792c 100644 --- a/filter_map/filter_map.py +++ b/filter_map/filter_map.py @@ -15,4 +15,10 @@ def filter_map(func: Callable[[Any], Tuple[bool, Any]], input_array: List[Any]) :param input_array: Исходный список. :return: Отфильтрованный список. """ - pass + + filtered_list = [] + for items in input_array: + result = func(items) + if result[0]: + filtered_list.append(result[1]) + return filtered_list From a59af930f3df3eb4422b0fd1439322b7b14a708c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=20=D0=9A=D1=80=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= Date: Fri, 7 Apr 2023 21:18:14 +0600 Subject: [PATCH 4/4] flask_exercises --- flask_exercises/flask_excercises.py | 47 +++++++++++++++++++++++- flask_exercises/test_flask_excercises.py | 10 +---- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/flask_exercises/flask_excercises.py b/flask_exercises/flask_excercises.py index 7e30fe2..f766edb 100644 --- a/flask_exercises/flask_excercises.py +++ b/flask_exercises/flask_excercises.py @@ -1,4 +1,10 @@ -from flask import Flask +from typing import Any, Tuple + +from flask import Flask, jsonify, request + +app = Flask(__name__) + +flask_dict = {} class FlaskExercise: @@ -28,4 +34,41 @@ class FlaskExercise: @staticmethod def configure_routes(app: Flask) -> None: - pass + app.add_url_rule("/user", view_func=FlaskExercise.create, methods=["POST"]) + app.add_url_rule("/user/", view_func=FlaskExercise.retrieve, methods=["GET"]) + app.add_url_rule("/user/", view_func=FlaskExercise.update, methods=["PATCH"]) + app.add_url_rule("/user/", view_func=FlaskExercise.delete, methods=["DELETE"]) + + @staticmethod + def create() -> tuple: + data = request.json.get("name") + if data: + flask_dict[data] = dict() + return {"data": f"User {data} is created!"}, 201 + return jsonify({"errors": {"name": "This field is required"}}), 422 + + @staticmethod + def retrieve(username: str) -> tuple: + if username in flask_dict: + return jsonify({"data": f"My name is {username}"}), 200 + return jsonify({"errors": "User not found"}), 404 + + @staticmethod + def update(username: str) -> tuple: + data = request.json.get("name") + if username in flask_dict: + flask_dict[data] = flask_dict[username] + del flask_dict[username] + return {"data": f"My name is {data}"}, 200 + return jsonify({"errors": {"name": "Имя не найдено"}}), 404 + + @staticmethod + def delete(username: str) -> Tuple[Any, int]: + if username in flask_dict: + del flask_dict[username] + return "", 204 + return {"errors": {"name": "Имя не найдено"}}, 404 + + +if __name__ == "__main__": + app.run(debug=True) diff --git a/flask_exercises/test_flask_excercises.py b/flask_exercises/test_flask_excercises.py index e06f3be..42485b9 100644 --- a/flask_exercises/test_flask_excercises.py +++ b/flask_exercises/test_flask_excercises.py @@ -3,7 +3,6 @@ from flask import Flask from flask.testing import FlaskClient -import pytest from .flask_excercises import FlaskExercise @@ -43,13 +42,11 @@ def delete_user(self, username: str) -> dict: assert response.status_code == HTTPStatus.NO_CONTENT return response.get_json() - @pytest.mark.skip def test_create(self) -> None: response = self.create_user({"name": "Heisenberg"}) assert response == {"data": "User Heisenberg is created!"} - @pytest.mark.skip def test_unprocessable_entity(self) -> None: response = self.flask_client.post( "/user", @@ -58,23 +55,21 @@ def test_unprocessable_entity(self) -> None: ) assert response.status_code == HTTPStatus.UNPROCESSABLE_ENTITY - assert response == {"errors": {"name": "This field is required"}} + assert response.get_json() == { + "errors": {"name": "This field is required"}} - @pytest.mark.skip def test_get(self) -> None: self.create_user({"name": "Heisenberg"}) response = self.retrieve_user("Heisenberg") assert response == {"data": "My name is Heisenberg"} - @pytest.mark.skip def test_update(self) -> None: self.create_user({"name": "Heisenberg"}) response = self.update_user("Heisenberg", {"name": "Jesse"}) assert response == {"data": "My name is Jesse"} - @pytest.mark.skip def test_delete(self) -> None: self.create_user({"name": "Heisenberg"}) self.delete_user("Heisenberg") @@ -82,7 +77,6 @@ def test_delete(self) -> None: response = self.flask_client.get("/user/Heisenberg") assert response.status_code == HTTPStatus.NOT_FOUND - @pytest.mark.skip def test_not_found(self) -> None: response = self.flask_client.get("/404") assert response.status_code == HTTPStatus.NOT_FOUND