Как вернуть словарные ключи в список в Python?
В Python 2.7 я мог бы получить словарные ключи, значения или элементы в виде списка:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
Теперь, в Python >= 3.3, я получаю что-то вроде этого:
>>> newdict.keys()
dict_keys([1, 2, 3])
Итак, я должен сделать это, чтобы получить список:
newlist = list()
for i in newdict.keys():
newlist.append(i)
Мне интересно, есть ли лучший способ вернуть список в Python 3?
Ответы
Ответ 1
Попробуйте list(newdict.keys())
.
Это преобразует объект dict_keys
в список.
С другой стороны, вы должны спросить себя, имеет ли это значение. Питоновский способ кодирования состоит в том, чтобы предположить, что утиная типизация (если она похожа на утку, и она уклоняется от утки, это утка). Объект dict_keys
будет действовать как список для большинства целей. Например:
for key in newdict.keys():
print(key)
Очевидно, что операторы вставки могут не работать, но это не имеет особого смысла для списка словарных клавиш.
Ответ 2
Python> = 3.5 альтернатива: распаковать в список литерал [*newdict]
Новые обобщения распаковки (PEP 448) были введены в Python 3.5, что теперь позволяет легко выполнять:
>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]
Распаковка с *
работает с любым итеративным объектом, и, поскольку словари возвращают свои ключи при повторении, вы можете легко создать список, используя его в литерале списка.
Добавление .keys()
т.е. [*newdict.keys()]
может помочь сделать ваше намерение немного более явным, хотя это будет стоить вам поиск функции и вызов. (что, честно говоря, это не то, что вы должны беспокоиться).
Синтаксис *iterable
похож на list(iterable)
и его поведение было первоначально задокументировано в разделе " Вызовы" Справочного руководства по Python.В PEP 448 ограничение на то, где может появиться *iterable
было ослаблено, что позволило его также помещать в литералы списков, наборов и кортежей, справочное руководство по спискам выражений также было обновлено, чтобы об этом заявить.
Хотя эквивалентно list(newdict)
с той разницей, что он быстрее (по крайней мере, для небольших словарей), потому что на самом деле не выполняется вызов функции:
%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop
%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop
%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop
с большими словарями скорость практически одинакова (накладные расходы на итерацию в большой коллекции превышают небольшие затраты на вызов функции).
Аналогичным образом вы можете создавать кортежи и наборы словарных ключей:
>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}
остерегайтесь запятой в случае кортежа!
Ответ 3
list(newdict)
работает как в Python 2, так и в Python 3, предоставляя простой список ключей в newdict
. keys()
не нужны. (:
Ответ 4
Отброшенное значение в определении "утка" - dict.keys()
возвращает итерируемый объект, а не объект, подобный списку. Он будет работать в любом месте, где будет выполняться итерация, - ни в одном месте списка. список также является итерируемым, но итерабельным является НЕ список (или последовательность...)
В реальных случаях использования наиболее распространенная вещь, связанная с ключами в dict, - это итерация через них, поэтому это имеет смысл. И если вам это нужно в качестве списка, вы можете позвонить 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']]
Ответ 5
Вы также можете использовать понимание списка:
>>> 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).
Ответ 6
Преобразование в список без использования метода keys
делает его более читаемым:
list(newdict)
и при прокрутке через словари нет необходимости keys()
:
for key in newdict:
print key
если вы не модифицируете его в цикле, для которого требуется создать список ключей, созданных заранее:
for key in list(newdict):
del newdict[key]
В Python 2 наблюдается незначительное увеличение производительности с помощью keys()
.
Ответ 7
Если вам нужно хранить ключи отдельно, здесь решение, которое требует меньше ввода, чем любое другое решение, представленное до сих пор, с использованием расширенной итерируемой распаковки (python3. x+).
newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict
k
# [1, 2, 3]
╒═══════════════╤═════════════════════════════════════════╕
│ k = list(d) │ 9 characters (excluding whitespace) │
├───────────────┼─────────────────────────────────────────┤
│ k = [*d] │ 6 characters │
├───────────────┼─────────────────────────────────────────┤
│ *k, = d │ 5 characters │
╘═══════════════╧═════════════════════════════════════════╛
Ответ 8
Кроме способов, упомянутых на этой странице, вы можете использовать itemgetter
из модуля оператора:
>>> from operator import itemgetter
>>> list(map(itemgetter(0), dd.items()))
[1, 2, 3]
Ответ 9
Вы также можете сделать tuple(dict)
или set(dict)
:
>>> list(set(newdict))
[1, 2, 3]
>>> list(tuple(newdict))
[1, 2, 3]
Ответ 10
Другой простой вариант - использовать понимание списка:
[key for key in dct.keys()]
Ответ 11
Список (newdict.keys())
list(newdict.keys())
Ответ 12
для получения ключа и значения dict
for key, value in dict.items():
print(key, value)
Ответ 13
list(newdict)
Это самое простое решение и работает как шарм!
Ответ 14
Кроме того, понимание списка не работает:
>>> parsed_results.keys()
dict_keys(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'])
>>> things2plot = [key.split(', ') for key in parsed_results.keys()]
>>> things2plot
['Sounder V Depth', 'F']
>>> for key in parsed_results.keys():
... print(key.split(', '))
...
['Sounder V Depth', 'F']
['Vessel Latitude', 'Degrees-Minutes']
Лично я считаю это "нарушением" утиной печати и, следовательно, "ошибкой". Но я полагаю, что кто-то еще, должно быть, заметил это к настоящему времени, и поэтому, если он не был исправлен, его следует рассматривать как "особенность", но я не могу для меня понять, почему.
Добавление в ответ Крису:
ОК, Крис, ну тогда, по крайней мере, лучшее обнаружение и уведомление о неправильном использовании ( "вам, похоже, не нужен итератор здесь, ожидаете ли вы списка? Список попыток (dict.keys())..." ) быть более похожим на полезный Python, который я вырос, чтобы знать и любить.:/(Я бы попросил вас предоставить данные для подтверждения вашего утверждения о том, что функциональность итератора является "более распространенным" вариантом использования для dict.keys, но вы, вероятно, сможете его предоставить.);-) поскольку мой пример понимания списка не работает (для меня), он был вырезанным и вставляемым из командной строки PyCharm, так что, возможно, проблема в этом была ошибкой. (Я уже сталкивался с другой "ошибкой" в этом сегодня, так что это меня не удивило бы.) Спасибо!