Чем отличается list от dict в Python?

«Чем отличается list от dict в Python?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте скриптов DevOps и автоматизации, list (список) и dict (словарь) — это фундаментальные, но разные структуры данных в Python, которые я использую для разных задач.

list (список):

  • Упорядоченная последовательность элементов.
  • Доступ к элементам осуществляется по целочисленному индексу (начиная с 0).
  • Подходит для хранения коллекций, где важен порядок или когда нужен простой перебор.

dict (словарь):

  • Неупорядоченная (до Python 3.7) / упорядоченная (с Python 3.7) коллекция пар ключ-значение.
  • Доступ к значению осуществляется по уникальному и неизменяемому ключу (строка, число, кортеж).
  • Подходит для хранения ассоциативных данных, конфигураций, быстрого поиска по ключу.

Практическое сравнение для задач автоматизации:

# Пример 1: list для списка серверов (порядок может быть важен)
servers_to_patch = ['web-server-01', 'db-primary', 'web-server-02']
for server in servers_to_patch:
    print(f"Patching {server}...")
# Доступ по индексу:
print(f"First server: {servers_to_patch[0]}")  # 'web-server-01'

# Пример 2: dict для конфигурации сервера или инвентори Ansible-like
server_config = {
    'hostname': 'web-01',
    'ip': '192.168.1.10',
    'role': 'nginx',
    'tags': ['production', 'us-east']
}
# Быстрый доступ по ключу:
print(f"Server IP: {server_config['ip']}")  # '192.168.1.10'
# Легко добавить или изменить параметр:
server_config['os'] = 'Ubuntu 20.04'

# Пример 3: Когда dict предпочтительнее — подсчет частот (логи, статусы)
http_status_codes = [200, 404, 200, 500, 404, 200]
status_count = {}
for code in http_status_codes:
    status_count[code] = status_count.get(code, 0) + 1
print(status_count)  # {200: 3, 404: 2, 500: 1} -> Быстрый O(1) доступ для обновления.

Ключевой вывод для производительности: Поиск элемента в list (например, if item in my_list) в худшем случае имеет сложность O(n), так как требует перебора. Поиск значения по ключу в dict в среднем имеет сложность O(1), что делает его значительно быстрее для больших объемов данных, если можно использовать ключ.