2009-12-09 2 views
18

Y a-t-il une meilleure façon de faire? Je n'ai pas vraiment besoin de trier la liste, juste de la numériser pour obtenir l'élément avec le plus grand attribut spécifié. Je me soucie le plus de la lisibilité, mais trier une liste entière pour obtenir un article semble un peu inutile.Façon pythonienne pour obtenir le plus grand élément dans une liste

>>> import operator 
>>> 
>>> a_list = [('Tom', 23), ('Dick', 45), ('Harry', 33)] 
>>> sorted(a_list, key=operator.itemgetter(1), reverse=True)[0] 
('Dick', 45) 

que je pouvais faire assez verbeux ...

>>> age = 0 
>>> oldest = None 
>>> for person in a_list: 
...  if person[1] > age: 
...    age = person[1] 
...    oldest = person 
... 
>>> oldest 
('Dick', 45) 

Répondre

46
max(a_list, key=operator.itemgetter(1)) 
+0

Nice, ne savait pas que Max avait un argument clé en option! – Noah

+1

Ah, génial! Un bon python me rend heureux. –

7

Vous pouvez utiliser la fonction max.

Aide fonction intégrée dans le module max __builtin__:

max (...)

max (itérables [, key = func]) -> Valeur

max (a, b, c, ... [, key = func]) -> valeur

Avec un seul argument itérable, renvoyez le plus grand élément. Avec deux arguments ou plus, renvoyez le plus grand argument.

max_item = max(a_list, key=operator.itemgetter(1)) 
2

Utilisez la fonction max() ou le faire de style FP:

reduce(lambda max, c: max if c <= max else c, [1, 6, 9, 2, 4, 0, 8, 1, 3]) 
5

La clé peut aussi être un lambda, par exemple:

people = [("Tom", 33), ("Dick", 55), ("Harry", 44)] 
oldest = max(people, key=lambda p: p[1]) 

Pour une raison quelconque, en utilisant un lambda donne l'impression que "mon code" fait le travail, comparé à itemgetter. Je pense que cela se sent particulièrement agréable quand vous avez une collection d'objets:

class Person(object): 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

people = [Person("Tom", 33), Person("Dick", 55), Person("Harry", 44)] 
oldest = max(people, key=lambda p: p.age) 
0

Certaines personnes ont mentionné la solution suivante:

max(nameOfList, key=len) 

Cependant, cette solution ne retourne que le premier élément séquentiel de la plus grande taille. Ainsi, par exemple, dans le cas de list ["ABC", "DCE"], seul le premier élément de la liste est renvoyé.

Pour y remédier, je trouve la solution suivante en utilisant la fonction de filtre:

filter((lambda x: len(x)==len(max(nameOfList, key=len))),nameOfList) 
Questions connexes