J'ai la liste suivante:

L=[
[ [4.0, 4.0] , [1.0, 2.0, 3.0] ],
[ [4.0, 5.0] , [1.0          ] ]
]

J'ai besoin d'obtenir la valeur maximale de chaque «colonne» de sous-listes. En d'autres termes, je dois obtenir:

result=[5.0, 3.0]

... car 5.0 est la valeur maximale dans la première 'colonne' des sous-listes:

[4.0, 4.0]
[4.0, 5.0]

... et 3.0 est la valeur maximale dans les secondes colonnes des sous-listes:

[1.0, 2.0, 3.0]
[1.0]

Le nombre de sous-listes peut changer, ainsi que le nombre de sous-listes et les valeurs à l'intérieur des sous-listes , je le crains. J'essaie depuis des heures mais je suis juste capable d'itérer dans la première valeur des sous-listes, donc je manque les valeurs maximales situées à la fin de leurs sous-listes respectives :-( Merci d'avance.

PS .: Malheureusement, je ne peux pas utiliser Pandas ou Numpy ...

-1
Victor 22 mai 2018 à 20:33

3 réponses

Meilleure réponse

Vous pouvez utiliser zip

L= [[[4.0, 4.0], [1.0, 2.0, 3.0]], [[4.0, 5.0], [1.0]]]
new_l = [max(c for b in i for c in b) for i in zip(*L)]

Production:

[5.0, 3.0]
1
Ajax1234 22 mai 2018 à 17:36

Solution laide utilisant functools.partial:

list(map(max, zip(*map(partial(map, max), L))))
# [5.0, 3.0]

Ici, map(partial(map, max), L) transforme chaque ligne en choisissant le maximum de chaque cellule; zip effectue la transposition; un autre map(max, ...) trouve le maximum de chaque colonne.

Solution moins laide:

c1 = c2 = 0
for col1, col2 in L:
    c1 = max(c1, *col1)
    c2 = max(c2, *col2)
# c1 = 5; c2 = 3
0
hilberts_drinking_problem 22 mai 2018 à 18:01

Vous pouvez utiliser:

In [140]: import itertools as it

In [141]: [max(max(g) for g in e if g) for e in it.zip_longest(*L)]
Out[141]: [5.0, 3.0]
0
llllllllll 22 mai 2018 à 17:43