Python> = 3.5 alternatywa: rozpakuj do literału listy [*newdict]
Nowe uogólnienia dotyczące rozpakowywania (PEP 448) zostały wprowadzone w Pythonie 3.5, umożliwiając łatwe wykonywanie:
>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]
Rozpakowywanie za pomocą *
działa z każdym obiektem, który można iterować, a ponieważ słowniki zwracają klucze podczas iteracji, możesz łatwo utworzyć listę, używając jej w literale listy.
Dodanie .keys()
np. [*newdict.keys()]
Może pomóc w uczynieniu twojej intencji nieco bardziej wyraźną, chociaż będzie to kosztowało wyszukiwanie funkcji i wywoływanie. (co, szczerze mówiąc , nie powinieneś się tym martwić).
*iterable
Składnia jest podobna do robienia list(iterable)
, a jego zachowanie było początkowo udokumentowane w sekcji Połączenia podręcznika Python Reference. W przypadku PEP 448 zlikwidowano ograniczenie dotyczące miejsca, w którym *iterable
może się pojawić, pozwalając na umieszczenie go również w literałach list, set i krotkach, zaktualizowano również podręcznik referencyjny list wyrażeń .
Jest to równoważne list(newdict)
z tą różnicą, że jest szybsze (przynajmniej w przypadku małych słowników), ponieważ w rzeczywistości nie jest wykonywane żadne wywołanie funkcji:
%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
w przypadku większych słowników prędkość jest prawie taka sama (narzut związany z iteracją przez dużą kolekcję przewyższa niewielki koszt wywołania funkcji).
W podobny sposób możesz tworzyć krotki i zestawy kluczy słownika:
>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}
uważaj na końcowy przecinek w krotce!