Python> = 3.5 альтернатива: распаковать в список литерал [*newdict]
Новые обобщения распаковки (PEP 448) были введены в Python 3.5, что теперь позволяет легко выполнять:
>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]
Распаковка *
работает с любым итеративным объектом, и, поскольку словари возвращают свои ключи при повторении, вы можете легко создать список, используя его в литерале списка.
Добавление .keys()
ie [*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}
остерегайтесь запятой в случае кортежа!