-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathpractice3.py
125 lines (95 loc) · 5.18 KB
/
practice3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from pathlib import Path
from typing import Dict, Any, List, Optional
import csv
def count_words(text: str) -> Dict[str, int]:
"""
Функция для подсчета слов в тексте.
При подсчете слов - все знаки препинания игнорируются.
Словом считается непрерывная последовательность длиной больше одного
символа, состоящая из букв в диапазоне A-Z и a-z.
Если в последовательности присутствует цифра - это не слово.
Hello - слово
Hello7 - не слово
При подсчете слов регистр букв не имеет значения.
Результат выполнения функции словарь, в котором:
ключ - слово в нижнем регистре
значение - количество вхождений слов в текст
:param text: текст, для подсчета символов
:return: словарь, в котором:
ключ - слово в нижнем регистре
значение - количество вхождений слов в текст
"""
# пиши свой код здесь
signs = [",", ".", "!", "?"]
result = {}
filtered_text = text.strip().lower()
for sign in signs:
filtered_text = filtered_text.replace(sign, "")
for word in filtered_text.split():
is_word = not any((letter.isdigit() or len(word) <= 1) for letter in word)
if is_word:
if word in result.keys():
result[word] += 1
else:
result[word] = 1
return result
def exp_list(numbers: List[int], exp: int) -> List[int]:
"""
Функция, которая возводит каждый элемент списка в заданную степень
:param numbers: список, состоящий из натуральных чисел
:param exp: в какую степень возвести числа в списке
:return: список натуральных чисел
"""
# пиши свой код здесь
return [pow(item, exp) for item in numbers]
def get_cashback(operations: List[Dict[str, Any]], special_category: List[str]) -> float:
"""
Функция для расчета кешбека по операциям.
За покупки в обычных категориях возвращается 1% от стоимости покупки
За покупки в special_category начисляют 5% от стоимости покупки
:param operations: список словарей, содержащих поля
amount - сумма операции
category - категория покупки
:param special_category: список категорий повышенного кешбека
:return: размер кешбека
"""
result = 0.0
for operation in operations:
result += operation["amount"] * (0.05 if operation["category"] in special_category else 0.01)
return result
def get_path_to_file() -> Optional[Path]:
"""
Находит корректный путь до тестового файла.
Если запускать тесты из pycharm - начальная папка - tests
Если запускать файлы через make tests - начальная папка - корень проекта
:return: путь до тестового файла tasks.csv
"""
if Path().resolve().name == 'tests':
base_path = Path().resolve().parent
else:
base_path = Path().resolve()
return base_path / 'tasks' / 'practice3' / 'tasks.csv'
def csv_reader(header: str) -> int:
"""
Функция считывает csv файл и подсчитывает количество
уникальных элементов в столбце.
Столбец выбирается на основе имени заголовка,
переданного в переменной header.
Обратите внимание на структуру файла!
Первая строка - строка с заголовками.
Остальные строки - строки с данными.
Файл для анализа: tasks.csv
Для того чтобы файл корректно открывался в тестах:
для получения пути до файла - используйте функцию get_path_to_file
которая определена перед функцией.
CSV анализируем с помощью встроенной библиотеки csv
:param header: название заголовка
:return: количество уникальных элементов в столбце
"""
# пиши свой код здесь
result = []
with open(get_path_to_file(), "r") as csv_file:
data = csv.DictReader(csv_file)
for item in data:
result.append(item[header])
return len(set(result))