From 570bd83509f588eddf84d0a0241e462e42e373cd Mon Sep 17 00:00:00 2001 From: aiali025jhb Date: Mon, 1 Dec 2025 15:48:07 +0200 Subject: [PATCH] . --- .vscode/settings.json | 11 +++ __pycache__/analytics.cpython-312.pyc | Bin 0 -> 4904 bytes __pycache__/test_analytics.cpython-312.pyc | Bin 0 -> 9468 bytes analytics.py | 30 ++++++-- practise.py | 77 +++++++++++++++++++++ 5 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 __pycache__/analytics.cpython-312.pyc create mode 100644 __pycache__/test_analytics.cpython-312.pyc create mode 100644 practise.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..184c4eb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "python.testing.unittestArgs": [ + "-v", + "-s", + ".", + "-p", + "test_*.py" + ], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": true +} \ No newline at end of file diff --git a/__pycache__/analytics.cpython-312.pyc b/__pycache__/analytics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc6b2148cfcde8eaf4ecb017034fcba3cf3e82db GIT binary patch literal 4904 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 daEaOc(b-=QeLQsc=v>D?nARs=irJthreshold: + return i + else: + return list +# print(filter_sales_above_threshold(([100, 250, 75, 300], 150))) + + def count_product_codes(codes: list, prefix: str): """ @@ -34,6 +42,13 @@ def count_product_codes(codes: list, prefix: str): """ # TODO: Write your code here pass + count = 0 + for code in codes: + if code.startswith(prefix): + count += 1 + return count + + def calculate_moving_average(numbers: list, window_size: int): @@ -50,9 +65,12 @@ def calculate_moving_average(numbers: list, window_size: int): - Return the average as a float rounded to 2 decimal places - Return 0.0 for empty list """ - # TODO: Write your code here - pass - + # # TODO: Write your code here + # pass + total=sum(numbers) + result=total/window_size + return result +# print(calculate_moving_average([10, 20, 30, 40, 50], 3)) # ========================================== # SECTION B: DICTIONARY OPERATIONS diff --git a/practise.py b/practise.py new file mode 100644 index 0000000..9f1cc95 --- /dev/null +++ b/practise.py @@ -0,0 +1,77 @@ +# # def filter_sales_above_threshold(sales: list, threshold: int): +# # """ +# # QUESTION 1 +# # ---------------------------------------- +# # Given a list of sales amounts (integers), return a NEW list containing +# # only values above the threshold. + +# # Example: filter_sales_above_threshold([100, 250, 75, 300], 150) → [250, 300] + +# # Logic: +# # - Do NOT modify the original list +# # - Return empty list if no values qualify +# # - Use a loop or list comprehension +# # """ +# # # TODO: Write your code here +# # pass + +# # list=[] +# # for i in list: +# # if i>threshold: +# # return i +# # else: +# # return list +# # print(filter_sales_above_threshold([100, 250, 75, 300], 150)) + + +# # def count_product_codes(codes: list, prefix: str): +# # """ +# # QUESTION 2 +# # ---------------------------------------- +# # Given a list of product codes (strings) and a prefix (string), +# # count how many codes START with the given prefix (case-sensitive). + +# # Example: count_product_codes(["PROD-001", "PROD-002", "SERV-001"], "PROD") → 2 + +# # Logic: +# # - Return 0 if no matches found +# # """ +# # # # TODO: Write your code here +# # # pass + + +# # prefix=0 +# # count=(["PROD-001", "PROD-002", "SERV-001"], "PROD") +# # count_prefix=count[1] +# # for i in count: +# # prefix=prefix+1 +# # print(prefix) + +# count = 0 +# for code in codes: +# if code.startswith(prefix): +# count += 1 +# return count + + + +def calculate_moving_average(numbers: list, window_size: int): + """ + QUESTION 3 + ---------------------------------------- + Calculate the average of the LAST window_size elements in the list. + + Example: calculate_moving_average([10, 20, 30, 40, 50], 3) → 40.0 + (average of last 3: 30, 40, 50) + + Logic: + - If the list has fewer elements than window_size, use all available elements + - Return the average as a float rounded to 2 decimal places + - Return 0.0 for empty list + """ + # # TODO: Write your code here + # pass + total=sum(numbers) + result=total/window_size + return result +print(calculate_moving_average([10, 20, 30, 40, 50], 3)) \ No newline at end of file