2017-07-20 1 views
0

Disons que j'ai cette structureObtenez une liste de résultats avec le maximum ou minimum par index dans une liste imbriquée

[[[1,2],[3,4]],[[8,9],[7,7]]] 

Je veux itérer la liste et ont ce résultat:

[[3,2],[8,7]] 

Cette serait de réduire la liste des tableaux dans le premier niveau [[1,2],[3,4]] à un seul tableau où le maximum sélectionné pour le premier élément et le minimum est trouvé pour le second. Je l'ai déjà fait manuellement, juste en itérant les groupes, en recommençant à nouveau, en stockant la première valeur et en voyant si le prochain est plus grand ou plus petit, je le stocke dans une liste et crée une autre liste. Je voudrais trouver une méthode plus élégante avec la compréhension de liste et ainsi de suite, je suis sûr que je peux utiliser zip ici pour regrouper les valeurs dans le même groupe mais je n'ai pas réussi jusqu'à présent.

Répondre

1

Vous pouvez utiliser zip et en déballer le résultat en valeurs individuelles, il est assez facile de faire ce que vous cherchez, par exemple:

>>> x = [[[1,2],[3,4]],[[8,9],[7,7]]] 
>>> [[max(a), min(b)] for k in x for a, b in [zip(*k)]] 
[[3, 2], [8, 7]] 

Une autre façon sans déballer est d'avoir une fonction cycliste itérables (max, min, max, min, ...) et utiliser compréhensions liste imbriquées, par exemple:

>>> import itertools as it 
>>> maxmin = it.cycle([max, min]) 
>>> [[next(maxmin)(a) for a in zip(*k)] for k in x] 
[[3, 2], [8, 7]] 

Ou index dans une liste de fonctions:

>>> import itertools as it 
>>> maxmin = [max, min] 
>>> [[maxmin[i](a) for i, a in enumerate(zip(*k))] for k in x] 
[[3, 2], [8, 7]] 
+0

Je ne veux pas nécessairement utiliser zip, c'était juste ce que je pensais pourrait aider. Je vais voir comment cela s'applique, les listes sont en réalité de quatre éléments. – Trufa

+0

Le commentaire était pour la réponse précédente avant la modification, je vais vérifier celui-ci. – Trufa

+0

Que voulez-vous dire 4 éléments, pouvez-vous donner un exemple plus complet? Cela ne se soucie pas du nombre de paires que vous avez ou de combien de groupes de paires vous avez mais ne fonctionnera pas si vous avez plus que des paires bien qu'il soit facile de les étendre - 'a, b, c, d' – AChampion

1

Cela fonctionnera sans zip:

mylist = [[[1,2],[3,4]],[[8,9],[7,7]]] 
[[max(y[0] for y in x), min(y[1] for y in x)] for x in mylist] 

L'inconvénient principal de c'est qu'il regarde à travers chaque sous-liste deux fois, une fois pour trouver le maximum (des premiers articles) et une fois pour trouver le minimum (des seconds articles).

+0

Oh, bien, cela semble à peu près ce dont j'ai besoin, le seul problème est que j'en ai quatre, donc je devrais itérer quatre fois chacun ... mais je ne pense pas que cela dépend de la performance. Je vais essayer. – Trufa