Как вернуть ключи словаря в виде списка в Python?
Я столкнулся с проблемой при работе со словарями в Python 3.3 и выше. В Python 2.7 я мог получить ключи, значения или элементы словаря в виде списка, используя метод .keys()
. Например:
newdict = {1:0, 2:0, 3:0}
print(newdict.keys())
# Результат: [1, 2, 3]
Однако, начиная с Python 3.3, когда я вызываю .keys()
, то получаю вместо этого объект типа dict_keys
:
newdict = {1:0, 2:0, 3:0}
print(newdict.keys())
# Результат: dict_keys([1, 2, 3])
Вопрос в том, как мне получить обычный список ключей в Python 3?
5 ответ(ов)
Функция list(newdict)
работает как в Python 2, так и в Python 3, возвращая простой список ключей из newdict
. Метод keys()
здесь не обязателен.
Вы также можете использовать генератор списков:
>>> newdict = {1: 0, 2: 0, 3: 0}
>>> [k for k in newdict.keys()]
[1, 2, 3]
Или, проще:
>>> [k for k in newdict]
[1, 2, 3]
Обратите внимание: порядок не гарантируется в версиях до 3.7 (в CPython 3.6 порядок все еще является лишь деталью реализации).
У небольшого недопонимания определения "duck typing" — метод dict.keys()
возвращает объект, который можно итерировать, а не объект, похожий на список. Он будет работать там, где можно использовать любой итерируемый объект, но не везде, где нужен список. Список также является итерируемым объектом, но итерируемый объект — это не обязательно список (или последовательность).
В реальных сценариях наиболее распространенное действие с ключами словаря — это их итерирование, поэтому это кажется логичным. Если вам действительно нужны ключи в виде списка, вы можете использовать функцию list()
.
Аналогично и для функции zip()
— в подавляющем большинстве случаев она также итерируется. Зачем создавать целый новый список кортежей, чтобы просто итерироваться по нему, а затем выбросить его?
Это часть большой тенденции в Python использовать больше итераторов (и генераторов), вместо создания копий списков повсюду.
Метод dict.keys()
должен работать с генераторами и списковыми выражениями — внимательно проверьте код на опечатки или другие ошибки... у меня работает нормально:
>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]
Да, есть лучший и более простой способ сделать это в Python 3.X
Используйте встроенную функцию list()
# Создаем словарь
newdict = {1:0, 2:0, 3:0}
# Получаем список ключей
key_list = list(newdict)
print(key_list)
# Вывод: [1, 2, 3]
Таким образом, вы можете легко получить список ключей из словаря, используя простую встроенную функцию.
Я могу предложить 2 способа, как можно извлекать ключи из словаря.
Метод 1: -
Можно использовать метод .keys()
, а затем преобразовать его в список.
some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
--> [1, 2, 3]
Метод 2: -
Можно создать пустой список и затем добавлять ключи в список с помощью цикла. С помощью этого цикла также можно получить значения (используйте .keys()
для получения только ключей и .items()
для извлечения как ключей, так и значений).
list_of_keys = []
list_of_values = []
for key, val in some_dict.items():
list_of_keys.append(key)
list_of_values.append(val)
print(list_of_keys)
--> [1, 2, 3]
print(list_of_values)
--> ['one', 'two', 'three']
Таким образом, у вас есть два эффективных метода для извлечения ключей и значений из словаря.
Как отсортировать список словарей по значению словаря в Python?
Создание словаря (dict) из отдельных списков ключей и значений
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе