-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathpractice3.py
135 lines (97 loc) · 5.16 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
126
127
128
129
130
131
132
133
134
135
import csv
from pathlib import Path
from typing import Dict, Any, List, Optional
def count_words(text: str) -> Dict[str, int]:
"""
Функция для подсчета слов в тексте.
При подсчете слов - все знаки препинания игнорируются.
Словом считается непрерывная последовательность длиной больше одного
символа, состоящая из букв в диапазоне A-Z и a-z.
Если в последовательности присутствует цифра - это не слово.
Hello - слово
Hello7 - не слово
При подсчете слов регистр букв не имеет значения.
Результат выполнения функции словарь, в котором:
ключ - слово в нижнем регистре
значение - количество вхождений слов в текст
:param text: текст, для подсчета символов
:return: словарь, в котором:
ключ - слово в нижнем регистре
значение - количество вхождений слов в текст
"""
# пиши свой код здесь
result = {}
words = text.split()
for word in words:
if any(char.isdigit() for char in word):
continue
word = ''.join(char.lower() for char in word if char.isalpha())
if word:
result[word] = result.get(word, 0) + 1
return result
def exp_list(numbers: List[int], exp: int) -> List[int]:
"""
Функция, которая возводит каждый элемент списка в заданную степень
:param numbers: список, состоящий из натуральных чисел
:param exp: в какую степень возвести числа в списке
:return: список натуральных чисел
"""
# пиши свой код здесь
result = []
result = [n ** exp for n in numbers]
return result
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:
if operation['category'] not in special_category:
result += operation['amount'] * 0.01
else:
result += operation['amount'] * 0.05
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: количество уникальных элементов в столбце
"""
# пиши свой код здесь
file_path = get_path_to_file()
result = set()
with open(file_path, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
result.add(row[header])
return len(result)