En entrée, j'obtiens une liste principale contenant des listes d'enfants (avec un nombre variable).

masterList = [[23,12],[34,21],[25,20]]

Le nombre de listes d'enfants varie. 3 listes d'enfants sont affichées ici, mais le nombre peut varier.
Je souhaite obtenir un maximum de premiers enregistrements et un minimum de deuxièmes enregistrements.
Dans ce cas, je sais que je peux coder en dur comme ça ...

maxNum = max(masterList[0][0], masterList[1][0], masterList[2][0])

Comment puis-je écrire un module pour accepter masterList avec un nombre variable de listes d'enfants et obtenir max, min?

Merci.

2
Vineet 11 avril 2018 à 17:15

7 réponses

Meilleure réponse

Vous pouvez utiliser zip:

masterList = [[23,12],[34,21],[25,20]]
first, second = zip(*masterList)
print(max(first))
print(min(second))

Modifier: pour les données avec des sous-listes contenant plus de deux éléments, vous pouvez utiliser le déballage Python3 pour prendre en compte le reste:

masterList = [[23,12, 24],[34,21, 23],[25,20, 23, 23]]
first, second, *_ = zip(*masterList)
print(max(first))
print(min(second))

Production:

34
12
8
Ajax1234 11 avril 2018 à 14:46

Si vous êtes satisfait de l'utilisation d'une bibliothèque tierce, utilisez numpy.

Cela est efficace pour les tableaux plus grands par rapport aux méthodes basées sur des listes.

import numpy as np

A = np.array([[23,12],[34,21],[25,20]])

res = A[:, 0].max(), A[:, 1].min()

# (34, 12)

Cette solution gère n'importe quelle longueur de listes / sous-listes de manière vectorisée. La seule exigence est que chaque sous-liste ait la même longueur.

Connexes: Pourquoi NumPy au lieu des listes Python?

1
jpp 13 avril 2018 à 08:28

Vous pouvez simplement utiliser le tri de fonction intégré, il n'utilise pas de boucles, c'est donc une méthode efficace.

largest = sorted(masterList, reverse=True)[0][0]
smallest = sorted(masterList, key=lambda masterList: masterList[1])[0][1]
1
Mufeed 11 avril 2018 à 14:48

Vous pouvez utiliser un générateur afin d'extraire l'élément pertinent de chaque liste interne.

max(innerList[0] for innerList in masterList)

min(innerList[1] for innerList in masterList)
3
Gabriel 12 avril 2018 à 12:31

Je suppose que vous cherchez un moyen d'obtenir le maximum de tous les 0e index et le min de tous les premiers éléments d'index.

max_of_first_element = max(masterList, key = lambda x:x[0])[0]
min_of_second_element = min(masterList, key = lambda x:x[1])[1]

Si vous avez besoin du min pas pour le deuxième élément mais pour le dernier toujours, alors:

min_of_last_element = min(masterList, key = lambda x:x[-1])[-1]

J'espère que ceci résoudra votre problème.

3
Kenstars 11 avril 2018 à 14:23

Vous pouvez également essayer:

import operator
max(masterList, key=operator.itemgetter(1))[0]
#34
min(masterList, key=operator.itemgetter(1))[1]
#12
1
Sruthi V 11 avril 2018 à 14:27

Pour obtenir le max / min de tous les premiers / seconds éléments de vos listes d'enfants, vous pouvez le faire:

maxNum = max(childlist[0] for childList in masterList)
minNum = min(childlist[1] for childList in masterList)
1
Tagas 12 avril 2018 à 12:55