Метод items() словаря в Python: возможности и применение

Раздел: Основы Python -> Методы словарей

Метод items() словаря Python: обзор и варианты использования

Как получить пары ключ-значение из словаря для итерации или других операций?

Метод items() возвращает представление (view object) пар (ключ, значение). Это представление динамически отражает изменения в словаре и поддерживает операции, характерные для множеств (пересечение, разность и т.д.).

sample = {'a': 1, 'b': 2, 'c': 3}
pairs = sample.items()
print(type(pairs))  # <class 'dict_items'>
print(list(pairs))  # [('a', 1), ('b', 2), ('c', 3)]

Python dict items (метод items словаря python)

Основное использование – перебор всех пар в цикле for:

for key, value in sample.items():
    print(f"{key}: {value}")

Python dict get (метод get словаря в python)

a: 1
b: 2
c: 3

Почему при изменении словаря во время итерации по items() возникает ошибка?

Изменение размера словаря (добавление/удаление ключей) во время итерации по items() вызывает RuntimeError: dictionary changed size during iteration. Решение – работать с копией: list(sample.items()) или sample.copy().items().

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

Использование list(dict.items()) – стандартный способ. Представление можно передать в конструктор list(), tuple() или set().

d = {'x': 10, 'y': 20}
print(tuple(d.items()))
(('x', 10), ('y', 20))

Как проверить, содержится ли конкретная пара ключ-значение в словаре?

Оператор in работает с представлением, но проверяется только ключ. Для проверки пары нужно сравнивать с кортежем:

d = {'key': 'value'}
print(('key', 'value') in d.items())  # True
print(('key', 'other') in d.items())  # False

Как создать новый словарь с изменёнными значениями на основе исходного?

Dict comprehension с items():

original = {'a': 1, 'b': 2, 'c': 3}
modified = {k: v*2 for k, v in original.items()}
print(modified)
{'a': 2, 'b': 4, 'c': 6}

Почему dict_items нельзя использовать как обычный список индексирования?

Представление не поддерживает прямой доступ по индексу (pairs[0] вызовет TypeError: 'dict_items' object is not subscriptable). Необходимо преобразовать в список или кортеж.

Как отфильтровать словарь по значению через items()?

Использование генераторного выражения или comprehension с условием:

data = {'apple': 5, 'banana': 8, 'cherry': 3}
filtered = {k: v for k, v in data.items() if v > 5}
print(filtered)
{'banana': 8}

Как объединить два словаря с помощью items()?

Метод | (Python 3.9+) или распаковка {**d1, **d2}. Можно также использовать dict(d1.items() | d2.items()) – но при пересечении ключей останется случайное значение (множество неупорядочено). Рекомендуется:

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
merged = dict(list(d1.items()) + list(d2.items()))
print(merged)
{'a': 1, 'b': 3, 'c': 4}

Почему при использовании оператора items() с set операции могут давать неожиданный результат?

dict_items ведёт себя как множество кортежей, поэтому поддерживает &, |, -. Но после таких операций получается объект set, а не dict_items. Для обратного преобразования в словарь используйте dict(set_of_tuples). Однако порядок может быть утерян.

Расширенные примеры работы с методом items()

Сортировка пар ключ-значение

Использование sorted() по значениям:

Пример
scores = {'Alice': 90, 'Bob': 75, 'Charlie': 95}
sorted_by_value = sorted(scores.items(), key=lambda item: item[1], reverse=True)
print(sorted_by_value)
[('Charlie', 95), ('Alice', 90), ('Bob', 75)]

Преобразование в pandas DataFrame

Если списки пар нужно превратить в таблицу:

Пример
import pandas as pd
data = {'Name': ['Alice', 'Bob'], 'Age': [30, 25]}
df = pd.DataFrame(data.items(), columns=['Key', 'Value'])
print(df)
      Key  Value
0    Name  [Alice, Bob]
1     Age    [30, 25]

Обратите внимание – значения сами могут быть списками, поэтому строки получаются некорректными. Лучше использовать DataFrame.from_dict(), но для демонстрации items() подходит.

Итерация с удалением по условию (безопасная)

Удаление всех записей с отрицательными значениями:

Пример
nums = {'a': 10, 'b': -5, 'c': 0, 'd': -2}
for key, val in list(nums.items()):
    if val < 0:
        del nums[key]
print(nums)
{'a': 10, 'c': 0}

Создание обратного словаря (значение-ключ)

При условии уникальности значений:

Пример
original = {'name': 'Alice', 'city': 'Paris', 'age': 30}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict)
{'Alice': 'name', 'Paris': 'city', 30: 'age'}

Использование с itertools.groupby

Группировка пар по первому символу ключа:

Пример
from itertools import groupby
d = {'apple': 5, 'apricot': 7, 'banana': 3}
sorted_items = sorted(d.items(), key=lambda x: x[0][0])
grouped = {k: dict(v) for k, v in groupby(sorted_items, key=lambda x: x[0][0])}
print(grouped)
{'a': {'apple': 5, 'apricot': 7}, 'b': {'banana': 3}}

Фильтрация по ключу с частичным совпадением

Выборка ключей, содержащих 'e':

Пример
words = {'hello': 1, 'world': 2, 'python': 3}
selected = {k: v for k, v in words.items() if 'e' in k}
print(selected)
{'hello': 1, 'world': 2}

Получение разницы между двумя словарями

Какие пары есть в первом, но нет во втором:

Пример
d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'b': 2, 'c': 4}
diff = set(d1.items()) - set(d2.items())
print(dict(diff))
{'a': 1, 'c': 3}

Почему set(d1.items()) - set(d2.items()) может не показать полную картину?

Операция сравнивает полные кортежи. Если у ключа 'c' значения разные, он появится в разности. Но если в d2 нет ключа 'a', пара ('a', 1) тоже будет в разности. Это правильно, но нужно помнить, что одинаковые пары исключаются.

Метод items словаря Python - comments

En
Python dict items (python)