Коллекции словарей со строковыми ключами и значениями в Python

Раздел: Основы Python -> Типы данных

Список словарей со строковыми ключами в Python

Тип list[dict[str, str]] описывает список, где каждый элемент является словарем, ключи и значения которого имеют строковый тип. Такая структура часто встречается при обработке JSON, CSV, конфигураций и табличных данных.

Основной подход: аннотация и обработка через list comprehension

Для большинства задач подходит явная аннотация и фильтрация через list comprehension. Метод dict.get снижает риск ошибки при отсутствии ключа.

from typing import List, Dict

records: List[Dict[str, str]] = [
    {'name': 'Анна', 'city': 'Москва', 'role': 'admin'},
    {'name': 'Иван', 'city': 'Пермь', 'role': 'user'},
    {'name': 'Ольга', 'city': 'Москва', 'role': 'user'},
]

def filter_by_city(items: List[Dict[str, str]], city: str) -> List[Dict[str, str]]:
    return [item for item in items if item.get('city') == city]

moscow_users = filter_by_city(records, 'Москва')
print(moscow_users)

значение bool python (значение bool в python)

[{'name': 'Анна', 'city': 'Москва', 'role': 'admin'}, {'name': 'Ольга', 'city': 'Москва', 'role': 'user'}]

длина переменной python (длина числа и переменной в python)

Подход удобен тем, что исходные данные не изменяются, а результат можно сразу передавать в другие функции. Для Python 3.9 и новее доступна запись list[dict[str, str]] без импорта из typing.

Как создать список словарей из нескольких списков?

Функция zip соединяет элементы по позициям, а генератор списка формирует словари с нужными строковыми ключами.

names = ['Анна', 'Иван']
cities = ['Москва', 'Пермь']
items = [{'name': n, 'city': c} for n, c in zip(names, cities)]
print(items)

Python максимальное целое число (максимальное целое число в python)

[{'name': 'Анна', 'city': 'Москва'}, {'name': 'Иван', 'city': 'Пермь'}]

Python list dict str str (список словарей со строковыми ключами в python)

Вариант подходит для сборки записей из колонок, ответов API или результатов параллельных запросов.

Как получить значение строкового ключа без ошибки KeyError?

Метод get возвращает значение по ключу или запасной вариант. Это удобно для необязательных полей.

records = [{'name': 'Анна'}, {'name': 'Иван', 'city': 'Пермь'}]
cities = [item.get('city', 'не указан') for item in records]
print(cities)

оператор float python (оператор float в python)

['не указан', 'Пермь']

Type 0 python (тип 0 в python)

Такой способ применяется при разборе данных, где часть словарей может не содержать все ключи.

Как сгруппировать словари по строковому ключу?

Класс defaultdict из модуля collections создает список для каждого нового ключа автоматически.

from collections import defaultdict

records = [
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Иван', 'city': 'Пермь'},
    {'name': 'Ольга', 'city': 'Москва'},
]
groups = defaultdict(list)
for item in records:
    groups[item['city']].append(item)
print(dict(groups))

S type python (тип s в python)

{'Москва': [{'name': 'Анна', 'city': 'Москва'}, {'name': 'Ольга', 'city': 'Москва'}], 'Пермь': [{'name': 'Иван', 'city': 'Пермь'}]}

тип элемента python (тип элемента в python)

Группировка полезна для отчетов, агрегации и подготовки данных к выводу.

Как сортировать по нескольким строковым ключам?

Ключ сортировки возвращает кортеж значений. Сначала сравнивается первый элемент, затем второй.

records = [
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Иван', 'city': 'Пермь'},
    {'name': 'Ольга', 'city': 'Москва'},
]
ordered = sorted(records, key=lambda item: (item.get('city', ''), item.get('name', '')))
print(ordered)

Code typing python (примеры кода с модулем typing в python)

[{'name': 'Анна', 'city': 'Москва'}, {'name': 'Ольга', 'city': 'Москва'}, {'name': 'Иван', 'city': 'Пермь'}]

целое положительное число python (целое положительное число)

Сортировка по кортежу помогает задать приоритет полей и сохранить предсказуемый порядок.

Как преобразовать список словарей в CSV и обратно?

Модуль csv работает со словарями через DictWriter и DictReader. Первый записывает строки, второй читает их как словари.

import csv
from io import StringIO

records = [
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Иван', 'city': 'Пермь'},
]
buffer = StringIO()
writer = csv.DictWriter(buffer, fieldnames=['name', 'city'])
writer.writeheader()
writer.writerows(records)
csv_text = buffer.getvalue()
print(csv_text)
reader = csv.DictReader(StringIO(csv_text))
restored = [dict(row) for row in reader]
print(restored)

Int python значения (целочисленные значения (int) в python)

name,city
Анна,Москва
Иван,Пермь

[{'name': 'Анна', 'city': 'Москва'}, {'name': 'Иван', 'city': 'Пермь'}]

Вариант применяется при обмене данными с электронными таблицами и внешними системами.

Типичные ошибки и проблемы

KeyError. Прямое обращение item['city'] вызывает исключение, если ключа нет. Метод get или проверка 'city' in item делает код устойчивее.

Изменение во время перебора. Удаление или добавление словарей в список во время цикла for может привести к пропуску элементов. Безопаснее создать новый список.

Аннотации не проверяются во время выполнения. Запись list[dict[str, str]] помогает инструментам, но Python не мешает положить в словарь число. Для строгой проверки нужны отдельные функции или библиотеки.

Версии Python. Синтаксис list[dict[str, str]] доступен с Python 3.9. В более старых версиях применяется List[Dict[str, str]] из typing.

Поверхностное копирование. Метод copy копирует только верхний уровень словаря. Вложенные значения остаются общими. Для полной независимости нужен copy.deepcopy.

Сортировка с отсутствующими ключами. Если ключ не найден и возвращается None, сравнение с строкой вызывает TypeError. Запасное значение в get решает эту проблему.

Выбор варианта зависит от задачи: фильтрация и проекция чаще выполняются через list comprehension, группировка через defaultdict, обмен данными через csv, а строгая проверка через отдельные функции.

- Str string python (функция str и строковый тип в python)

Расширенные примеры для списка словарей со строковыми ключами

Проверка структуры и типов

Пример
from typing import Any, List, Dict

def is_str_dict_list(value: Any) -> bool:
    if not isinstance(value, list):
        return False
    for item in value:
        if not isinstance(item, dict):
            return False
        for key, val in item.items():
            if not isinstance(key, str) or not isinstance(val, str):
                return False
    return True

data: List[Dict[str, str]] = [
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Иван', 'city': 'Пермь'},
]
print(is_str_dict_list(data))
print(is_str_dict_list([{'name': 'Анна', 'age': 30}]))
True
False

Переименование строковых ключей

Пример
records = [
    {'first_name': 'Анна', 'last_name': 'Петрова'},
    {'first_name': 'Иван', 'last_name': 'Сидоров'},
]
renamed = [
    {'name': item['first_name'], 'surname': item['last_name']}
    for item in records
]
print(renamed)
[{'name': 'Анна', 'surname': 'Петрова'}, {'name': 'Иван', 'surname': 'Сидоров'}]

Слияние двух коллекций по строковому идентификатору

Пример
users = [
    {'id': '1', 'name': 'Анна'},
    {'id': '2', 'name': 'Иван'},
]
cities = [
    {'id': '1', 'city': 'Москва'},
    {'id': '2', 'city': 'Пермь'},
]
city_by_id = {item['id']: item['city'] for item in cities}
merged = [
    {'id': user['id'], 'name': user['name'], 'city': city_by_id.get(user['id'], '')}
    for user in users
]
print(merged)
[{'id': '1', 'name': 'Анна', 'city': 'Москва'}, {'id': '2', 'name': 'Иван', 'city': 'Пермь'}]

Удаление дубликатов по составному ключу

Пример
records = [
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Анна', 'city': 'Москва'},
    {'name': 'Иван', 'city': 'Пермь'},
]
seen = set()
unique = []
for item in records:
    key = (item['name'], item['city'])
    if key not in seen:
        seen.add(key)
        unique.append(item)
print(unique)
[{'name': 'Анна', 'city': 'Москва'}, {'name': 'Иван', 'city': 'Пермь'}]

Поверхностное и глубокое копирование

Пример
import copy

records = [{'name': 'Анна', 'tags': {'role': 'admin'}}]
shallow = [item.copy() for item in records]
deep = copy.deepcopy(records)
shallow[0]['tags']['role'] = 'user'
print(records)
print(deep)
[{'name': 'Анна', 'tags': {'role': 'user'}}]
[{'name': 'Анна', 'tags': {'role': 'admin'}}]

Фильтрация с несколькими условиями

Пример
records = [
    {'name': 'Анна', 'city': 'Москва', 'role': 'admin'},
    {'name': 'Иван', 'city': 'Пермь', 'role': 'user'},
    {'name': 'Ольга', 'city': 'Москва', 'role': 'user'},
]
filtered = [
    item for item in records
    if item.get('city') == 'Москва' and item.get('role') == 'user'
]
print(filtered)
[{'name': 'Ольга', 'city': 'Москва', 'role': 'user'}]

Частотный анализ строковых значений

Пример
from collections import Counter

records = [
    {'city': 'Москва'},
    {'city': 'Пермь'},
    {'city': 'Москва'},
]
counter = Counter(item['city'] for item in records)
print(counter)
print(counter.most_common(1))
Counter({'Москва': 2, 'Пермь': 1})
[('Москва', 2)]

Динамическое обновление записей

Пример
records = [
    {'name': 'Анна', 'status': 'new'},
    {'name': 'Иван', 'status': 'new'},
]
for item in records:
    if item['name'] == 'Анна':
        item['status'] = 'active'
print(records)
[{'name': 'Анна', 'status': 'active'}, {'name': 'Иван', 'status': 'new'}]

Построение словаря из списка по строковому ключу

Пример
records = [
    {'code': 'A', 'title': 'Первый'},
    {'code': 'B', 'title': 'Второй'},
]
by_code = {item['code']: item for item in records}
print(by_code)
print(by_code['A']['title'])
{'A': {'code': 'A', 'title': 'Первый'}, 'B': {'code': 'B', 'title': 'Второй'}}
Первый

Сортировка с учетом регистра строк

Пример
records = [
    {'name': 'анна'},
    {'name': 'Борис'},
    {'name': 'Антон'},
]
ordered = sorted(records, key=lambda item: item['name'].lower())
print(ordered)
[{'name': 'анна'}, {'name': 'Антон'}, {'name': 'Борис'}]

Поиск записи по строковому ключу

Пример
records = [
    {'id': 'u1', 'name': 'Анна'},
    {'id': 'u2', 'name': 'Иван'},
]
found = next((item for item in records if item.get('id') == 'u2'), None)
print(found)
{'id': 'u2', 'name': 'Иван'}

список словарей со строковыми ключами в Python - comments

En
Python list dict str str (python)