web-dev-qa-db-fra.com

Comprendre la liste des boucles Python

J'utilise beaucoup de tableaux N dimensionnels et il devient difficile d'avoir à écrire un tel code en retrait et je sais que certains codes peuvent être remplacés par des listes de compréhension et des instructions en ligne. Par exemple:

for x in (0,1,2,3):
    for y in (0,1,2,3):
        if x < y:
            print (x, y, x*y)

peut être remplacé par:

print [(x, y, x * y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

Mais comment pourrais-je changer l'action au lieu d'imprimer pour faire autre chose comme:

total = x+y

Donc ce que je veux faire, c'est quelque chose comme:

[(total+=x+y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

Mais cela ne fonctionne pas

Existe-t-il un moyen intelligent de le faire plutôt que:

for x in (0,1,2,3):
        for y in (0,1,2,3):
            if x < y:
                total+=x+y
26
disruptive

sum fonctionne ici:

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
32
Jochen Ritzel

Comme alternative à l'écriture de boucles de N niveaux en profondeur, vous pouvez utiliser itertools.product() :

In [1]: import itertools as it

In [2]: for x, y in it.product((0,1,2,3),(0,1,2,3)):
   ...:     if x < y:
   ...:         print x, y, x*y

0 1 0
0 2 0
0 3 0
1 2 2
1 3 3
2 3 6

Cela s'étend naturellement aux dimensions N.

12
NPE

Utilisez numpy . Cela vous permet d'utiliser des tableaux qui s'additionnent comme des vecteurs:

x = numpy.arange(3)
y = numpy.arange(3)
total = x + y

Avec la question modifiée, ajoutez également un appel à sum

total = numpy.sum(x+y)
5
Michael J. Barber

La fonction Réduire réduit directement les éléments collectifs en un seul élément. Vous pouvez en savoir plus ici , mais cela devrait fonctionner pour vous:

total=reduce(lambda x,y:x+y,range(4))

ou

total=reduce(lambda x,y:x+y,(0,1,2,3))
2
WebServer

Une autre possibilité est:

for x,y in ((x,y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y):
  print (x, y, x * y)

De cette façon, vous pouvez parcourir tout ce que vous utiliseriez dans une compréhension de liste sans réellement créer la liste comprise (si vous comprenez mon sens;) Si la liste comprise est grande, peut-être si grande qu'elle sature ou ne tient même pas en mémoire, c'est assez pratique ..

2
drevicko