Pour trouver la valeur maximale dans une matrice de nombres, nous pouvons coder 5 lignes pour résoudre le problème:

ans = matrix[0][0]
for x in range(len(matrix)):
    for y in range(len(matrix[0])):
        ans = max(ans, matrix[x][y])
return ans

Existe-t-il une solution sur une seule ligne pour ce problème? Celui que j'ai trouvé est assez maladroit en fait:

return max(max(matrix, key=max))

Ou

return max(map(max, matrix))
13
Pei Z 7 mars 2016 à 09:17

4 réponses

Meilleure réponse

Vous pouvez utiliser expression de générateur pour trouver le maximum dans votre matrice. De cette façon, vous pouvez éviter de construire la liste complète des éléments de matrice en mémoire.

maximum = max(max(row) for row in matrix)

Au lieu de la compréhension de la liste comme indiqué dans une réponse précédente ici

maximum = max([max(row) for row in matrix])

Il s'agit de PEP (la justification section):

... la plupart des cas d'utilisation n'ont pas besoin d'avoir une liste complète créée dans Mémoire. Au lieu de cela, il leur suffit de parcourir les éléments un par un heure.

...

Les expressions de générateur sont particulièrement utiles avec des fonctions comme sum (), min () et max () qui réduisent une entrée itérable à une seule valeur

...

L'utilité des expressions de générateur est grandement améliorée lorsqu'elles sont combinées avec des fonctions de réduction comme sum (), min () et max () .

Jetez également un œil à cet article SO: Expressions de générateur vs compréhension de liste.

16
Community 23 mai 2017 à 10:27

En utilisant numpy.amax:

import numpy as np
>>> my_array
array([[1, 2, 3],
       [9, 8, 6]])
>>> np.amax(my_array)
9
5
Hackaholic 7 mars 2016 à 06:38

Par matrice, je suppose que vous entendez une liste 2D.

max([max(i) for i in matrix])
8
Display Name 7 mars 2016 à 06:19

Vous pouvez également aplatir votre tableau:

from itertools import chain

flatten = chain.from_iterable

max(flatten(matrix))
5
GingerPlusPlus 7 mars 2016 à 06:46