Альтернатива Python> = 3.5: розпакуйте в літеральний список [*newdict]
З Python 3.5 було введено нові розпаковувальні узагальнення (PEP 448), що дозволяють тепер легко робити:
>>> 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}
остерігайтеся зап'ястя в коробці!