2010-11-28 8 views

Antwort

8

Versuch:

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

oder

import operator 

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

Wenn das erste Element immer 'a' sein wird, können Sie einfach tun

max(nested_list) 

Wenn Sie bereit sind, in einige tauchen Typprüfung und Sie wollen dies für beliebige Unterlisten tun (Nur für eine Ebene. Etwas wie [12 , 'a', 12, 42, 'b']), können Sie etwas wie.

import numbers 

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

In jedem Fall, wenn Sie nicht sicher sind, dass die Elemente nested_list in der Tat Listen sind, können Sie

import collections 

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

tun und es nur eine Schlüsselfunktion Ihres eigenen Planen Pass oder einem der anderen in dieser Antwort.

In Bezug auf die lambda x: x[1] vs operator.itemgetter(1) Frage, würde ich Profil. In Princible, itemgetter sollte der eine richtige Weg sein, aber ich habe gesehen, operator Lösungen outperformed von Lambda-Funktion zu "Bugs" (ich benutze den Begriff locker, der Code funktioniert immer noch) in operator. Meine Präferenz wäre für itemgetter, wenn die Leistung keine Rolle spielt (und wahrscheinlich, wenn dies der Fall ist), aber einige Leute mögen es, die zusätzliche import zu vermeiden.

+1

Ich musste meine Python Bücher greifen Ihre Lösung herauszufinden. Also, ich habe jetzt nicht nur eine Lösung, ich verstehe ein wenig mehr Python. Vielen Dank! –

1

Macht das was du willst?

biggest = nested_list[0] 

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

Es gibt keinen Grund, Code wie diesen in Python zu schreiben. –

+0

@Ignacio Vazquez-Abrams, Sorgfalt zu erarbeiten? Die Version mit max (...) ist ein wenig eleganter, aber das OP scheint jemand zu sein, der neu in der Sprache ist, und ich würde nicht erwarten, dass sie in Lambda-Ausdrücke eintauchen, bevor sie für Schleifen verstehen. – xscott

1

Wenn die Liste ist so einfach, wie Sie vorschlagen:

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

Wenn die erste Position der inneren Listen den gleichen Wert hat, sicher. Ansonsten, nein. –

+0

@Ignacio Vazquez-Abrams: Ja, ich weiß, das ist eine sehr einfache Antwort. Die Lösung kann basierend auf dem Umfang der Eingaben gewunden werden. :) – pyfunc