Python> = 3.5 alternative: décompresser dans une liste littérale [*newdict]
De nouvelles généralisations de déballage (PEP 448) ont été introduites avec Python 3.5 vous permettant désormais de faire facilement:
>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]
Le décompactage *
fonctionne avec n'importe quel objet qui est itérable et, puisque les dictionnaires renvoient leurs clés lorsqu'ils sont itérés, vous pouvez facilement créer une liste en l'utilisant dans un littéral de liste.
L'ajout de .keys()
ie [*newdict.keys()]
pourrait aider à rendre votre intention un peu plus explicite, mais cela vous coûtera une recherche et une invocation de fonction. (ce qui, en toute honnêteté, n'est pas quelque chose dont vous devriez vraiment vous inquiéter).
La *iterable
syntaxe est similaire à faire list(iterable)
et son comportement a été initialement documenté dans la section Appels du manuel de référence Python. Avec le PEP 448, la restriction sur l'endroit où *iterable
pourrait apparaître a été assouplie, ce qui permet de le placer également dans les littéraux de liste, de set et de tuple, le manuel de référence sur les listes d'expressions a également été mis à jour pour l'indiquer.
Bien qu'équivalent à list(newdict)
la différence qu'il est plus rapide (au moins pour les petits dictionnaires) car aucun appel de fonction n'est réellement effectué:
%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
avec des dictionnaires plus grands, la vitesse est à peu près la même (le surcoût lié à l'itération dans une grande collection l'emporte sur le faible coût d'un appel de fonction).
De la même manière, vous pouvez créer des tuples et des ensembles de clés de dictionnaire:
>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}
méfiez-vous de la virgule de fin dans le tuple case!