Keys: примеры (PYTHON)

Метод keys() для получения ключей словаря в Python
Раздел: Словари, Итерации
keys: dict_keys

Функция keys в Python

Метод keys() в Python применяется к объектам типа словарь (dict) и возвращает специальный объект представления (dictionary view object), отображающий все ключи словаря.

Использование метода актуально, когда возникает необходимость получить перечень ключей словаря для последующей итерации, проверки наличия элемента или преобразования в другую коллекцию.

Синтаксис метода не предусматривает передачи аргументов: dict.keys().

Возвращаемое значение - объект представления dict_keys. Это динамическое представление, которое автоматически отражает изменения в исходном словаре. Объект поддерживает операции, характерные для множеств (set), такие как проверка принадлежности, пересечение, объединение (с Python 3.8), и является итерируемым. Для получения статического списка ключей результат можно передать в конструктор list().

Простые примеры применения

Базовый пример получения ключей словаря.

my_dict = {'a': 1, 'b': 2, 'c': 3}
keys_view = my_dict.keys()
print(keys_view)
dict_keys(['a', 'b', 'c'])

Итерация по объекту представления.

for key in my_dict.keys():
    print(key)
a
b
c

Проверка принадлежности ключа к словарю с использованием keys().

print('b' in my_dict.keys())
True

Преобразование представления в список.

keys_list = list(my_dict.keys())
print(keys_list)
['a', 'b', 'c']

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

dict1 = {'x': 10, 'y': 20}
dict2 = {'y': 20, 'z': 30}
print(dict1.keys() & dict2.keys()) # Пересечение
{'y'}

Схожие методы словарей в Python

В Python для словарей существуют методы, возвращающие другие представления данных.

dict.values(): возвращает объект представления (dict_values) всех значений словаря. Подходит для операций, где важны только значения, а не ключи.

dict.items(): возвращает объект представления (dict_items) пар (ключ, значение) в виде кортежей. Оптимальный выбор для одновременного доступа и к ключу, и к значению в цикле.

Метод keys() предпочтителен, когда требуется работать исключительно с ключами. Для проверки наличия ключа в словаре эффективнее использовать оператор in напрямую с самим словарем ('key' in dict), чем с представлением keys(), так как это встроенная операция.

Частые ошибки при работе с keys()

Попытка вызова метода keys() у объекта, не являющегося словарем.

my_list = [1, 2, 3]
my_list.keys()
AttributeError: 'list' object has no attribute 'keys'

Предположение, что dict_keys является списком. Попытка использовать методы списка, например, индексацию, вызовет ошибку.

d = {'a': 1}
keys_view = d.keys()
print(keys_view[0])
TypeError: 'dict_keys' object is not subscriptable

Изменение размера словаря во время итерации по представлению keys() может привести к ошибке RuntimeError.

d = {'a': 1, 'b': 2}
for k in d.keys():
    if k == 'a':
        d['c'] = 3 # Добавляем элемент
RuntimeError: dictionary changed size during iteration

История изменений метода keys

В Python 2.x метод dict.keys() возвращал список ключей, что требовало дополнительной памяти для создания копии данных. С переходом на Python 3.x возвращаемым значением стал объект динамического представления dict_keys, что экономит память и позволяет эффективно выполнять операции над множествами. Начиная с Python 3.8, объекты представления словаря стали реверсивными (reversed(dict.keys())).

Расширенные примеры использования

Использование представления ключей для фильтрации словаря по другому набору ключей.

Пример python
original = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
allowed_keys = {'a', 'c', 'e'}
filtered_keys = original.keys() & allowed_keys
filtered_dict = {k: original[k] for k in filtered_keys}
print(filtered_dict)
{'a': 1, 'c': 3}

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

Пример python
dict_a = {'x': 10, 'y': 20}
dict_b = {'y': 25, 'z': 30}
common_keys = dict_a.keys() & dict_b.keys()
unique_to_a = dict_a.keys() - dict_b.keys()
print("Общие:", common_keys, "Уникальные для A:", unique_to_a)
Общие: {'y'} Уникальные для A: {'x'}

Создание упорядоченного списка ключей по условию (например, по соответствующим значениям).

Пример python
scores = {'Иван': 45, 'Мария': 90, 'Петр': 60}
top_scorers = [key for key in scores.keys() if scores[key] > 50]
print(top_scorers)
['Мария', 'Петр']

Динамическое обновление представления. Изменения в словаре немедленно видны во всех связанных представлениях ключей.

Пример python
d = {1: 'one'}
keys_view = d.keys()
print('До:', list(keys_view))
d[2] = 'two'
print('После:', list(keys_view))
До: [1]
После: [1, 2]

Передача представления ключей в функции, ожидающие итерируемый объект, например, для сериализации.

Пример python
import json
data = {'name': 'Alice', 'age': 30}
# json.dumps работает с dict напрямую, но keys() может быть полезен.
print("Ключи как JSON-массив:", json.dumps(list(data.keys())))
Ключи как JSON-массив: ["name", "age"]

Аналоги функции в других языках

JavaScript: Object.keys(obj) возвращает массив ключей перечисляемых свойств объекта. В отличие от Python, результат статический (массив).

const obj = {a: 1, b: 2};
console.log(Object.keys(obj));
['a', 'b']

PHP: array_keys($array) возвращает индексированный массив всех ключей массива. Может фильтровать значения.

$arr = ['a' => 1, 'b' => 2];
print_r(array_keys($arr));
Array
(
    [0] => a
    [1] => b
)

Java: map.keySet() возвращает набор (Set) ключей отображения (Map). Набор связан с исходной картой.

Map map = new HashMap<>();
map.put("a", 1);
System.out.println(map.keySet());
[a]

C#: свойство Dictionary.Keys возвращает коллекцию, содержащую ключи словаря. Изменения в словаре отражаются в коллекции.

var dict = new Dictionary {{ "a", 1 }};
Console.WriteLine(string.Join(", ", dict.Keys));
a

Go: для получения ключей отображения (map) используется цикл for range, предварительного получения среза ключей нет встроенной функции, требуется ручное создание среза.

m := map[string]int{"a": 1}
var keys []string
for k := range m {
    keys = append(keys, k)
}
fmt.Println(keys)
[a]

Kotlin: свойство map.keys возвращает неизменяемый набор (Set) ключей.

val map = mapOf("a" to 1)
println(map.keys)
[a]

питон keys function comments

En
Keys Return view of dict keys