Possible de renvoyer deux listes à partir d'une compréhension de liste?
Est-il possible de renvoyer deux listes à partir d'une compréhension de liste? Eh bien, cela ne fonctionne évidemment pas, mais quelque chose comme:
rr, tt = [i*10, i*12 for i in xrange(4)]
, Donc rr
et tt
les deux sont des listes avec les résultats de i*10
et i*12
respectivement.
Merci beaucoup
3 réponses
>>> rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])
>>> rr
(0, 10, 20, 30)
>>> tt
(0, 12, 24, 36)
Il est possible pour une compréhension de liste de renvoyer plusieurs listes si les éléments sont des listes. Ainsi, par exemple:
>>> x, y = [[] for x in range(2)]
>>> x
[]
>>> y
[]
>>>
L'astuce avec la fonction zip
ferait le travail, mais est en fait beaucoup plus simple et lisible si vous collectez simplement les résultats dans des listes avec une boucle.
Selon mes tests, la création de deux listes de compréhensions gagne (au moins pour les longues listes). Sachez que la réponse la mieux votée est plus lente même que les boucles For traditionnelles. les compréhensions des listes sont plus rapides et plus claires.
python -m timeit -n 100 -s 'rr=[];tt = [];' 'for i in range(500000): rr.append(i*10);tt.append(i*12)'
10 loops, best of 3: 123 msec per loop
> python -m timeit -n 100 rr,tt = zip(*[(i*10, i*12) for i in range(500000)])'
10 loops, best of 3: 170 msec per loop
> python -m timeit -n 100 'rr = [i*10 for i in range(500000)]; tt = [i*10 for i in range(500000)]'
10 loops, best of 3: 68.5 msec per loop
Ce serait bien de voir des listes de compréhension supportant la création de plusieurs listes à la fois.