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())).
Расширенные примеры использования
Использование представления ключей для фильтрации словаря по другому набору ключей.
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}Сравнение ключей двух словарей без создания промежуточных списков.
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'}Создание упорядоченного списка ключей по условию (например, по соответствующим значениям).
scores = {'Иван': 45, 'Мария': 90, 'Петр': 60}
top_scorers = [key for key in scores.keys() if scores[key] > 50]
print(top_scorers)['Мария', 'Петр']
Динамическое обновление представления. Изменения в словаре немедленно видны во всех связанных представлениях ключей.
d = {1: 'one'}
keys_view = d.keys()
print('До:', list(keys_view))
d[2] = 'two'
print('После:', list(keys_view))До: [1] После: [1, 2]
Передача представления ключей в функции, ожидающие итерируемый объект, например, для сериализации.
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]