В 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 ?
python
python-3.x
list
dictionary
python-2.x
Димитрис Фасаракис Хиллиард
источник
источник
Ответы:
Попробуй
list(newdict.keys())
.Это преобразует
dict_keys
объект в список.С другой стороны, вы должны спросить себя, имеет ли это значение. Pythonic способ кодирования состоит в том, чтобы предположить типизацию утки ( если это похоже на утку, и это крякает как утка, это - утка ).
dict_keys
Объект будет действовать как список для большинства целей. Например:Очевидно, что операторы вставки могут не работать, но это не имеет особого смысла для списка словарных ключей в любом случае.
источник
list(newdict)
также работает (по крайней мере, в Python 3.4). Есть ли причина использовать.keys()
метод?pdb> list(newdict.keys())
сбой, потому что он конфликтует с командой pdb с тем же именем. Используйтеpdb> !list(newdict.keys())
для экранирования команд pdb..keys()
гораздо яснее, что происходит.Python> = 3.5 альтернатива: распаковать в список литерал
[*newdict]
Новые обобщения распаковки (PEP 448) были введены в Python 3.5, что теперь позволяет легко выполнять:
Распаковка
*
работает с любым итеративным объектом, и, поскольку словари возвращают свои ключи при повторении, вы можете легко создать список, используя его в литерале списка.Добавление
.keys()
ie[*newdict.keys()]
может помочь сделать ваши намерения немного более явными, хотя это будет стоить вам поиск и вызов функции. (что, честно говоря, это не то, что вы должны действительно беспокоиться).*iterable
Синтаксис аналогичен делатьlist(iterable)
и его поведение было изначально зафиксировано в разделе Вызовы на Python Справочное руководство. С PEP 448*iterable
было ослаблено ограничение на место появления, что позволило также размещать его в литералах списков, наборов и кортежей. Справочное руководство по спискам выражений также было обновлено.Хотя это эквивалентно
list(newdict)
тому, что это быстрее (по крайней мере, для небольших словарей), потому что на самом деле не выполняется вызов функции:с большими словарями скорость практически одинакова (накладные расходы на итерацию большой коллекции превышают небольшие затраты на вызов функции).
Аналогичным образом вы можете создавать кортежи и наборы словарных ключей:
остерегайтесь запятой в случае кортежа!
источник
def foo(*args): print(args)
последующим выводомfoo(*{1:0, 2:0})
результата(1, 2)
. Это поведение указано в разделе « Вызовы » справочного руководства. Python 3.5 с PEP 448 просто ослабил ограничения на то, где они могут появиться,[*{1:0, 2:0}]
и теперь их можно использовать. В любом случае, я отредактирую свой ответ и включу их.*newdict
- это определенно ответ для игроков в гольф кода; P. Кроме того: что, честно говоря, это не то, что вы действительно должны беспокоиться - и если вы, не используйте Python .list(newdict)
работает как в Python 2, так и в Python 3, предоставляя простой список ключей вnewdict
.keys()
не обязательно (:источник
Немного оторвано от определения «типизирования утки» -
dict.keys()
возвращает итеративный объект, а не объект, подобный списку. Он будет работать везде, где будет работать итерация, а не в любом месте списка. список также является итеративным, но итеративный НЕ является списком (или последовательностью ...)В реальных случаях использования наиболее распространенные действия с ключами в dict - это их итерация, так что это имеет смысл. И если они вам нужны как список, вы можете позвонить
list()
.Точно так же
zip()
- в подавляющем большинстве случаев он повторяется - зачем создавать целый новый список кортежей, просто повторять его, а затем выбрасывать снова?Это часть большой тенденции в Python использовать больше итераторов (и генераторов), а не копировать списки повсюду.
dict.keys()
должен работать с пониманием, хотя - проверьте внимательно на опечатки или что-то ... это прекрасно работает для меня:источник
.keys()
; объект словаря является сам итерацию и производит ключи при итерации:[key.split(", ") for key in d]
.Вы также можете использовать понимание списка :
Или короче,
Примечание: заказ не гарантируется в версиях под 3.7 (заказ по-прежнему только деталь реализации с CPython 3.6).
источник
list(newdict)
. Здесь нет необходимости для понимания списка.Преобразование в список без использования
keys
метода делает его более читабельным:и при просмотре словарей нет необходимости
keys()
:если вы не изменяете его в цикле, для которого потребуется предварительно созданный список ключей:
На Python 2 наблюдается незначительный прирост производительности при использовании
keys()
.источник
Если вам нужно хранить ключи отдельно, вот решение, которое требует меньше ввода, чем любое другое решение, представленное до сих пор, с использованием расширенной итерируемой распаковки (python3.x +).
источник
k
здесь всегда есть список. Если пользователь хочет получить кортеж или набор из ключей, ему необходимо обратиться к другим параметрам.*k, = d
имеет ограничения на то, где он может появиться (но посмотрите и, возможно, обновите этот ответ для PEP 572 - расширенная распаковка не поддерживается для выражений присваивания atm, но это может произойти когда-нибудь! )keys, vals = zip(*d.items())
(хотя это дает два кортежа, достаточно близко). Я не знаю более короткого выражения, чем это.Я могу придумать 2 способа, которыми мы можем извлечь ключи из словаря.
Способ 1: - Чтобы получить ключи с помощью метода .keys (), а затем преобразовать его в список.
Способ 2: - Создать пустой список, а затем добавить ключи к списку через цикл. Вы также можете получить значения с помощью этого цикла (используйте .keys () только для ключей и .items () для извлечения ключей и значений)
источник