2010-11-28 40 views

Répondre

8

essayer:

max(nested_list, key=lambda x: x[1]) 

ou

import operator 

max(nested_list, key=operator.itemgetter(1)) 

Si le premier élément sera toujours 'a', vous pouvez juste faire

max(nested_list) 

Si vous êtes prêt à plonger dans des vérification de type et que vous voulez faire pour les sous-listes arbitraires (d'un seul niveau. , 'a', 12, 42, 'b']), vous pouvez faire quelque chose comme.

import numbers 

max(nested_list, key=lambda x: max(i for i in x 
            if isinstance(i, numbers.Integral))) 

Dans tous les cas, si vous n'êtes pas sûr que les éléments de nested_list sont dans les listes de fait, vous pouvez faire

import collections 

max((s for s in nested_list 
    if isinstance(s, collections.Sequence)), 
    key=some_key_function) 

et passer juste une fonction clé de votre propre conception ou d'un des autres dans cette réponse.

En termes de lambda x: x[1] par rapport à operator.itemgetter(1) question, je voudrais profiler. En principe, itemgetter devrait être la seule bonne façon, mais j'ai vu operator solutions sont surpassées par la fonction lambda faire à «bogues» (j'utilise le terme vaguement, le code fonctionne toujours) en operator. Ma préférence serait pour itemgetter si la performance n'a pas d'importance (et probablement si c'est le cas), mais certaines personnes aiment éviter les import supplémentaires.

+1

J'ai eu recours à mes livres de Python pour trouver votre solution. Donc, non seulement j'ai maintenant une solution, je comprends un peu plus python. Merci! –

1

Est-ce que cela fait ce que vous voulez?

biggest = nested_list[0] 

for entry in nested_list: 
    if entry[1] > biggest[1]: 
     biggest = entry 
+1

Il n'y a aucune raison d'écrire du code comme ça en Python. –

+0

@Ignacio Vazquez-Abrams, Vous voulez élaborer? La version avec max (...) est un peu plus élégante, mais l'OP semble être quelqu'un de nouveau dans le langage, et je ne m'attendrais pas à ce qu'ils plongent dans des expressions lambda avant de comprendre pour les boucles. – xscott

1

Si la liste est aussi simple que vous suggérer:

>>> nested_list = [['a', 3], ['a', 1], ['a', 5], ['a',2]] 
>>> k = sorted(nested_list) 
>>> k[-1] 
['a', 5] 
>>> 
+0

Si la première position des listes internes a la même valeur, bien sûr. Sinon, non. –

+0

@Ignacio Vazquez-Abrams: Oui, je sais que c'est une réponse très simpliste. La solution peut devenir compliquée en fonction de la portée des entrées. :) – pyfunc