2 votes

Comment trouver le minimum d'une matrice dans plusieurs listes en python ?

J'ai 3 listes de prix :

iexMin =  [20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
withLimit =  [0.649, 1.298, 1.298, 2.538, 2.596, 2.596, 2.560, 2.560, 0.560, 1.682, 1.682, 2.242, 2.242, 2.242, 2.287, 2.592, 2.388, 2.98, 3.29, 3.299]
beyondLimit =  [0.66, 2.30134, 2.30155, 2.30171, 2.955, 2.51, 2.519, 2.51, 1.749, 1.749, 1.749, 1.745, 1.749, 1.82208, 1.8993, 1.899, 2.29657, 2.29659, 2.29692, 2.30931]

Je les divise en 4 groupes de 5 éléments, puis je les trie par ordre décroissant pour obtenir les 4 premières valeurs minimales de chaque liste, puis je compare toutes les valeurs minimales de toutes les listes :

n = 5
a = [iexMin[i:i + n] for i in range(0, len(iexMin), n)]
b = [withLimit[i:i + n] for i in range(0, len(iexMin), n)]
c = [beyondLimit[i:i + n] for i in range(0, len(iexMin), n)]

testList1 = [sorted(block)[:4] for block in a]
testList2 = [sorted(block)[:4] for block in b]
testList3 = [sorted(block)[:4] for block in c]

price1 = [item for t in testList1 for item in t]
price2 = [item for t in testList2 for item in t]
price3 = [item for t in testList3 for item in t]

minRate = [min(price1[i],price2[i],price3[i]) for i in range(len(price1))]

sortie :

min rate =  [0.649, 1.298, 1.298, 2.30171, 0.56, 1.682, 2.51, 2.51, 1.682, 1.749, 1.749, 1.82208, 1.899, 2.29657, 2.29659, 2.29692]

Le seul problème avec cette sortie est que je ne compare pas la matrice entière ici. Comme je l'ai dit au début, je divise les listes en 4 blocs de 5 éléments, donc je veux comparer tout le bloc en une fois et les 5 valeurs minimales de chaque bloc. Le résultat attendu sera donc le suivant :

IEXMin = [[20, 20, 20, 20], [20, 20, 20, 20], [20, 20, 20, 20], [20, 20, 20, 20]]
withinLimit = [[0.649, 1.298, 1.298, 2.538], [0.56, 1.682, 2.56, 2.56], [1.682, 2.242, 2.242, 2.242], [2.388, 2.592, 2.98, 3.29]]
beyondLimit = [[0.66, 2.30134, 2.30155, 2.30171], [1.749, 1.749, 2.51, 2.51], [1.745, 1.749, 1.749, 1.82208], [1.899, 2.29657, 2.29659, 2.29692]]

##Expected Answer##
min rate =  [0.649, 0.66, 1.298, 1.298, 0.56, 1.682, 1.749, 1.749, 1.682, 1.745, 1.749, 1.749, 1.899, 2.29657, 2.29659, 2.29692]

Donc, comme vous pouvez le voir, je veux en fait comparer le bloc à la fois et obtenir les 4 premières valeurs min de chaque bloc. Quelqu'un peut-il m'aider ?

2voto

DaveIdito Points 1246

Je pense que vous avez fait un travail supplémentaire et donc rendu les choses complexes. Voici une façon de résoudre le problème :

En utilisant votre code :

n = 5
a = [iexMin[i:i + n] for i in range(0, len(iexMin), n)]
b = [withLimit[i:i + n] for i in range(0, len(iexMin), n)]
c = [beyondLimit[i:i + n] for i in range(0, len(iexMin), n)]

Ensuite,

minRate = [sorted(a+b+c)[:4] for a,b,c in zip(a, b, c)]
minRate = [item for each in minRate for item in each]
print(minRate)

Sortie : [0.649, 0.66, 1.298, 1.298, 0.56, 1.682, 1.749, 1.749, 1.682, 1.745, 1.749, 1.749, 1.899, 2.29657, 2.29659, 2.29692]

L'erreur dans votre code d'origine était que vous compariez les éléments au même indice dans les trois listes (la dernière ligne), puis vous augmentiez l'indice.

Mise à jour : Comment sorted(a+b+c) travail ?

Tout d'abord, le a,b,c dans la compréhension de la liste correspondent aux blocs des listes a , b , c que vous avez défini. Je viens de découvrir que la réutilisation a,b,c plus pratique mais j'aurais certainement pu utiliser de meilleurs noms.

Maintenant que c'est fait, le + joint en fait des listes ensemble. [1,1]+[1,1] donnera [1,1,1,1] par exemple. Donc je concaténer les blocs en un seul, puis les trier et choisir le plus petit 4- sorted(a+b+c)[:4] .

Un mot de prudence lors de l'utilisation de numpy : Utilisation de + avec les tableaux numpy les ajoutera plutôt comme des vecteurs. Puisque ici je pouvais déduire de vos compréhensions que ce n'était pas un tableau numpy, j'ai utilisé l'opérateur de liste Python + pour obtenir le résultat souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X