2013-05-23 8 views
6

Ich möchte eine Funktion haben, die größte von N-Liste zurückgeben. Mit zwei Elemente in der Liste kann ich schreiben:Python - zurück größte von N-Listen

l1 = [3, 4, 5] 
l2 = [4, 5, 6, 7] 

def f(L): 
    if(len(L[0]) > len(L[1])): 
     return L[0] 
    else: 
     return L[1] 

, die ich mit f([l1, l2]) laufen.

Jedoch mit mehr Listen wird es eine Folge von if-Anweisungen, und es ist hässlich.

Wie würden Sie die größte von N Listen sehr effizient zurückgeben?

Antwort

28

Verwenden Sie max mit key=len.

In [3]: max([l1, l2], key=len) 
Out[3]: [4, 5, 6, 7] 

Dies wird die (erste) längste Liste, um eine Liste der Listen abrufen.

In der Tat wird dies auch mit Strings (und anderen Objekten mit einem len-Attribut) funktionieren.

In [4]: max(['abcd', 'ab'], key=len) 
Out[4]: 'abcd' 

In [5]: max([(1, 2), (1, 2, 3), (1,)], key=len) 
Out[5]: (1, 2, 3) 

In [6]: max(['abc', [1, 2, 3]], key=len) 
Out[6]: 'abc' 

Hinweis: Wir können auch in den Einzelteilen als Argumente übergeben:

In [7]: max(l1, l2, key=len) 
Out[7]: [4, 5, 6, 7] 

max liest: Holen Sie mir das größte Element in der Liste beim Blick aus der Perspektive (wenn Sie key passieren) von key.
Es ist grob den folgenden Code * äquivalent (in Python 3), aber die eigentliche Quelle ist written in C (so viel effizienter, als auch tatsächlich getestet, so fahren Sie bitte max und das nicht verwenden!):

def my_max(*L, key=None): # in python 2 we'd need to grab from kwargs (and raise type error if rogue keywords are passed) 
    L = list(L[0]) if len(L) == 1 else L # max takes iterable as first argument, or two or more arguments... 
    if not L: 
     raise ValueError("my_max() arg is an empty sequence") 
    if key is None: # if you don't pass a key use the identity 
     key = lambda x: x 
    max_item, max_size = L[0], key(L[0]) 
    for item in L[1:]: 
     if key(item) > max_size: 
      max_item, max_size = item, key(item) 
    return max_item 

* Ich überlasse es als Übung, dies mit Iteratoren anstelle von Listen zu schreiben ... und andere Fehler zu beheben!

+0

Wow, ich wusste nicht über diese Funktion. Genial! – Mezgrman

+0

das ist wirklich ein guter Weg –

Verwandte Themen