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}
остерегайтесь запятой в случае кортежа!