Skip to content

Практическая работа №6

Цель работы: Научиться использовать основные коллекции Python — списки, кортежи, словари и множества — для хранения, поиска, фильтрации, сортировки и обработки данных, в том числе данных, связанных с компьютерными системами и сетями.

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Списки

Список (list) — изменяемая упорядоченная коллекция элементов.

loads = [45, 72, 88, 91, 67]

Получение элемента:

print(loads[0])
print(loads[-1])

Добавление элемента:

loads.append(84)

Изменение:

loads[0] = 50

Удаление:

loads.remove(72)

Количество элементов:

print(len(loads))

Перебор:

for load in loads:
print(load)

2. Поиск, фильтрация и сортировка списков

Проверка наличия:

if 91 in loads:
print("Значение найдено")

Сортировка списка:

loads.sort()

Создание отсортированной копии:

sorted_loads = sorted(loads)

Фильтрация:

critical = []
for load in loads:
if load > 80:
critical.append(load)

3. Кортежи

Кортеж (tuple) — упорядоченная неизменяемая коллекция.

server = ("srv01", "192.168.1.10", "online")

Распаковка:

name, ip, status = server
print(name)
print(ip)
print(status)

Кортежи удобно использовать для фиксированных наборов значений.

4. Словари

Словарь (dict) хранит пары ключ: значение.

servers = {
"srv01": "192.168.1.10",
"srv02": "192.168.1.11"
}

Получение значения:

print(servers["srv01"])

Добавление или изменение:

servers["srv03"] = "192.168.1.12"

Перебор:

for name, ip in servers.items():
print(name, ip)

Проверка наличия ключа:

if "srv01" in servers:
print("Узел существует")

5. Множества

Множество (set) хранит уникальные элементы.

addresses = {
"192.168.1.10",
"192.168.1.11",
"192.168.1.12"
}

Добавление:

addresses.add("192.168.1.13")

Преобразование списка во множество автоматически удаляет повторы:

addresses = set([
"192.168.1.10",
"192.168.1.10",
"192.168.1.11"
])
print(addresses)

6. Операции над множествами

configured = {"srv01", "srv02", "srv03"}
online = {"srv01", "srv03", "srv04"}

Пересечение:

print(configured & online)

Разность:

print(configured - online)

Объединение:

print(configured | online)

7. Комбинирование коллекций

Коллекции можно использовать совместно.

Например, список словарей:

servers = [
{"name": "srv01", "ip": "192.168.1.10", "status": "online"},
{"name": "srv02", "ip": "192.168.1.11", "status": "offline"}
]

Перебор:

for server in servers:
print(server["name"], server["status"])

Для каждого задания необходимо:

  1. Определить входные и выходные данные.
  2. Составить алгоритм решения.
  3. При необходимости представить алгоритм в виде блок-схемы.
  4. Реализовать программу на языке Python.
  5. Использовать коллекцию, указанную в условии задания.
  6. Проверить программу минимум на трёх наборах данных.
  7. Объяснить преподавателю, почему выбран именно этот тип коллекции.
  8. В заданиях с файлами использовать уже изученные конструкции with open(...), strip() и split().
  9. Не использовать пользовательские функции: они будут рассматриваться в следующей теме.

Задания для выполнения

Section titled “Задания для выполнения”

Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 15, варианты повторяются по кругу: 16-й студент выполняет вариант 1, 17-й — вариант 2 и т.д.

№Тип задачиОписание задачи
1СписокДан список значений загрузки CPU: [45, 72, 88, 91, 67, 53, 84]. Найдите среднее, минимальное и максимальное значения. Сформируйте новый список значений выше 80.
2СловарьСоздайте словарь имя_узла: IP-адрес минимум для 5 узлов. Реализуйте поиск IP-адреса по введённому имени узла.
3Множество + файлПрочитайте IP-адреса из addresses.txt. Выведите количество строк, количество уникальных адресов и сами уникальные адреса.

Содержимое файла addresses.txt:

192.168.1.10
192.168.1.11
192.168.1.10
192.168.1.15
192.168.1.20
192.168.1.11
192.168.1.25
192.168.1.20
№Тип задачиОписание задачи
1СписокПользователь вводит 8 значений свободного места на диске. Сохраните их в список, отсортируйте и выведите значения ниже заданного порога.
2СловарьСоздайте словарь служба: состояние, например ssh: active. Выведите только службы со значением inactive.
3МножестваДаны множества установленных и требуемых пакетов. Определите, какие пакеты необходимо установить, какие уже установлены и какие являются лишними.

Используйте исходные данные:

installed = {"nginx", "python3", "git", "curl", "nano"}
required = {"nginx", "python3", "git", "docker", "wget"}
№Тип задачиОписание задачи
1СписокДан список времени ответа узлов. Значение -1 означает отсутствие ответа. Сформируйте список только положительных значений и найдите среднее время ответа.
2КортежСоздайте кортеж (hostname, ip, status) и выполните распаковку его значений в отдельные переменные.
3Словарь + файлВ hosts.txt строки имеют формат hostname ip. Сформируйте словарь hostname: ip и выведите его содержимое.

Исходный список для задания 1:

responses = [15, 21, -1, 18, 46, -1, 31, 27, 104, 19]

Содержимое файла hosts.txt:

srv01 192.168.1.10
srv02 192.168.1.11
router01 192.168.1.1
printer01 192.168.1.50
backup01 192.168.1.20
№Тип задачиОписание задачи
1СписокДан список портов. Пользователь вводит номер порта. Определите, присутствует ли он в списке, и выведите его позицию, если он найден.
2МножествоДан список IP-адресов с повторениями. Преобразуйте его во множество и выведите уникальные адреса и их количество.
3СловарьСоздайте словарь порт: служба и реализуйте поиск службы по введённому номеру порта.

Используйте данные:

ports = [22, 80, 443, 53, 3306, 8080, 5432]
addresses = [
"192.168.1.10",
"192.168.1.11",
"192.168.1.10",
"10.0.0.1",
"192.168.1.11",
"10.0.0.2"
]
№Тип задачиОписание задачи
1СписокВ списке находятся значения температуры оборудования. Найдите значения выше 70 и отсортируйте их по убыванию.
2СловарьСоздайте словарь с количеством ошибок по IP-адресам. Выведите IP-адрес с наибольшим количеством ошибок.
3Файл + коллекцииПрочитайте errors.log, где в каждой строке первым полем находится IP-адрес. Сформируйте список всех адресов и множество уникальных адресов. Выведите количество всех и уникальных адресов.

Исходные данные для задания 1:

temperatures = [48, 67, 72, 81, 59, 77, 91, 64, 73]

Содержимое файла errors.log:

192.168.1.15 ERROR authentication_failed
192.168.1.20 ERROR timeout
192.168.1.15 ERROR authentication_failed
192.168.1.30 ERROR connection_refused
192.168.1.15 ERROR permission_denied
192.168.1.20 ERROR timeout
192.168.1.40 ERROR disk_full
№Тип задачиОписание задачи
1СписокПользователь вводит 10 чисел. Сохраните их в список, сформируйте новый список без отрицательных значений и выведите оба списка.
2КортежиСоздайте список из четырёх кортежей вида (hostname, ip, status) и выведите только узлы со статусом online.
3МножестваДаны множества configured и online. Определите настроенные, но недоступные узлы; доступные, но отсутствующие в конфигурации; узлы, присутствующие в обоих множествах.

Используйте данные:

configured = {"srv01", "srv02", "srv03", "srv04", "srv05"}
online = {"srv01", "srv03", "srv05", "srv06"}
№Тип задачиОписание задачи
1СписокДан список объёмов сетевого трафика. Определите сумму, среднее значение и три максимальных значения.
2СловарьСоздайте словарь пользователь: количество_входов. Выведите пользователей, у которых количество входов больше заданного пользователем значения.
3Файл + словарьВ users.txt строки имеют формат username role. Сформируйте словарь и выведите всех пользователей с ролью admin.

Исходный список для задания 1:

traffic = [450, 780, 1200, 640, 980, 1500, 720, 2100, 860, 1100]

Содержимое файла users.txt:

admin admin
ivanov user
petrov admin
student user
operator operator
root admin
guest guest
№Тип задачиОписание задачи
1СписокДан список имён файлов. Сформируйте новый список только из файлов с расширением .log.
2МножествоСоздайте множества пользователей двух групп. Определите пользователей, входящих в обе группы, и пользователей, принадлежащих только первой группе.
3СловарьСоздайте словарь имя_файла: размер. Выведите файл минимального и максимального размера.

Используйте данные:

files = [
"auth.log",
"config.txt",
"access.log",
"README.md",
"system.log",
"hosts.conf"
]
group1 = {"admin", "ivanov", "petrov", "student"}
group2 = {"petrov", "student", "operator", "guest"}
№Тип задачиОписание задачи
1СписокДан список состояний узлов. Подсчитайте количество online, offline и maintenance.
2СловарьСоздайте словарь интерфейс: IP-адрес. Добавьте новый интерфейс, измените адрес существующего и удалите один интерфейс.
3МножестваДаны множества разрешённых и фактически используемых портов. Определите разрешённые используемые порты, используемые, но неразрешённые порты и разрешённые, но неиспользуемые порты.

Используйте данные:

statuses = [
"online",
"offline",
"online",
"maintenance",
"online",
"offline",
"online"
]
allowed_ports = {22, 80, 443, 53}
used_ports = {22, 80, 3306, 8080}
№Тип задачиОписание задачи
1СписокДан список чисел. Сформируйте новый список без повторяющихся элементов, сохранив порядок первого появления.
2СловарьСоздайте словарь hostname: status. Подсчитайте количество узлов со статусом online и offline.
3Файл + список словарейВ servers.txt строки имеют формат hostname;ip;status. Сформируйте список словарей и выведите данные обо всех серверах. Затем подсчитайте количество узлов со статусом online.

Исходный список для задания 1:

numbers = [5, 2, 5, 7, 2, 9, 1, 7, 3, 9, 4]

Содержимое файла servers.txt:

srv01;192.168.1.10;online
srv02;192.168.1.11;offline
srv03;192.168.1.12;online
backup01;192.168.1.20;online
db01;192.168.1.30;offline
№Тип задачиОписание задачи
1СписокПользователь вводит 7 значений загрузки RAM. Сформируйте список значений выше среднего и отсортируйте его по убыванию.
2КортежСоздайте кортеж с данными сетевого интерфейса: имя, IP-адрес, маска. Выполните распаковку и выведите значения.
3СловарьСоздайте словарь IP: количество_ошибок. Выведите все IP, у которых ошибок больше 3, и определите общее количество ошибок.

Пример словаря для задания 3:

errors = {
"192.168.1.10": 1,
"192.168.1.15": 7,
"192.168.1.20": 3,
"192.168.1.25": 5,
"192.168.1.30": 2
}
№Тип задачиОписание задачи
1СписокДан список имён служб. Отсортируйте его по алфавиту, выведите количество элементов и проверьте наличие ssh.
2МножестваДаны множества пакетов на двух серверах. Определите общие пакеты и пакеты, присутствующие только на первом сервере.
3Файл + словарьВ services.txt строки имеют формат service status. Сформируйте словарь и выведите неактивные службы.

Исходные данные:

services = ["nginx", "ssh", "docker", "cron", "postgresql", "redis"]
server1 = {"nginx", "python3", "git", "docker", "curl"}
server2 = {"nginx", "python3", "postgresql", "curl", "nano"}

Содержимое файла services.txt:

ssh active
nginx active
postgresql inactive
docker active
redis inactive
cron active
№Тип задачиОписание задачи
1СписокДан список IP-адресов. Отсортируйте их как строки и выведите первый и последний элементы результата.
2СловарьСоздайте словарь имя_узла: время_ответа. Выведите узел с минимальным и максимальным временем ответа.
3Множество + файлПрочитайте login.log, где имя пользователя находится первым полем. Определите количество записей и количество уникальных пользователей.

Исходные данные для задания 1:

addresses = [
"192.168.1.20",
"10.0.0.5",
"192.168.1.3",
"172.16.0.1",
"192.168.1.100"
]

Содержимое файла login.log:

admin LOGIN_SUCCESS
student LOGIN_FAILED
ivanov LOGIN_SUCCESS
admin LOGIN_SUCCESS
student LOGIN_SUCCESS
petrov LOGIN_FAILED
admin LOGIN_FAILED
ivanov LOGIN_SUCCESS
№Тип задачиОписание задачи
1СписокДан список значений состояния оборудования от 0 до 100. Разделите значения на два списка: ниже 50 и 50 или выше.
2СловарьСоздайте словарь устройство: модель. Реализуйте поиск модели по введённому имени устройства.
3МножестваДаны множества обнаруженных и зарегистрированных устройств. Определите незарегистрированные устройства, отсутствующие зарегистрированные устройства и устройства, присутствующие в обоих множествах.

Используйте данные:

values = [12, 67, 45, 89, 51, 34, 76, 20, 95]
registered = {"pc01", "pc02", "srv01", "printer01", "router01"}
detected = {"pc01", "srv01", "printer01", "unknown01", "phone01"}
№Тип задачиОписание задачи
1СписокПользователь вводит значения использования диска. Сформируйте список значений от 80 до 100 включительно и отсортируйте его по убыванию.
2СловарьСоздайте словарь код_события: описание. Реализуйте поиск описания по введённому коду события.
3Файл + коллекцииВ inventory.txt строки имеют формат hostname;ip. Сформируйте словарь узлов и множество всех IP-адресов. Выведите количество узлов и количество уникальных IP-адресов.

Содержимое файла inventory.txt:

srv01;192.168.1.10
srv02;192.168.1.11
backup01;192.168.1.20
db01;192.168.1.30
router01;192.168.1.1
printer01;192.168.1.50
  1. Что такое список в Python?
  2. Чем список отличается от кортежа?
  3. Как добавить элемент в список?
  4. Как удалить элемент из списка?
  5. В чём различие между sort() и sorted()?
  6. Как проверить наличие значения в списке?
  7. Что хранит словарь?
  8. Как добавить или изменить элемент словаря?
  9. Как перебрать одновременно ключи и значения словаря?
  10. Для чего используются множества?
  11. Что произойдёт с повторяющимися элементами при преобразовании списка во множество?
  12. Что означают объединение, пересечение и разность множеств?
  13. Когда удобно использовать кортеж?
  14. Что такое список словарей и в каких задачах он может применяться?
  15. Как можно использовать коллекции совместно с данными, прочитанными из текстового файла?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Python Documentation — Data Structures
  2. Python Documentation — Built-in Types
  3. Python Documentation — Dictionaries
  4. Python Documentation — Sets