13

Как вернуть ключи словаря в виде списка в Python?

32

Я столкнулся с проблемой при работе со словарями в 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 ответ(ов)

0

Функция list(newdict) работает как в Python 2, так и в Python 3, возвращая простой список ключей из newdict. Метод keys() здесь не обязателен.

0

Вы также можете использовать генератор списков:

>>> 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 порядок все еще является лишь деталью реализации).

0

У небольшого недопонимания определения "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']]
0

Да, есть лучший и более простой способ сделать это в Python 3.X


Используйте встроенную функцию list()

# Создаем словарь
newdict = {1:0, 2:0, 3:0}
# Получаем список ключей
key_list = list(newdict)
print(key_list) 
# Вывод: [1, 2, 3] 

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

0

Я могу предложить 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']

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь