2012-11-15 11 views
13

Powiel możliwe:
Python’s most efficient way to choose longest string in list?Python: Długość najdłuższej podlisty?

Mam listę L

L = [[1,2,3],[5,7],[1,3],[77]] 

chcę wrócić długość najdłuższego podmenu bez konieczności pętli przez nich, w w tym przypadku 3, ponieważ [1,2,3] jest długością 3 i jest najdłuższą z czterech podlist. Próbowałem len (max (L)), ale to nie robi, co chcę. Jakikolwiek sposób to zrobić, czy jest to moja jedyna pętla?

+0

DUP z http://stackoverflow.com/q/873327/1180720 – gefei

Odpowiedz

33

max(L,key=len) daje obiekt o najdłuższej długości ([1,2,3] w swoim przykładzie) - rzeczywiście dostać długości (jeśli to wszystko co obchodzi), można zrobić len(max(L,key=len)), która jest nieco brzydki - ja rozbij go na 2 linie. Lub możesz użyć wersji dostarczonej przez ecatamur.

Wszystkie te odpowiedzi mają pętle - w moim przypadku pętle to domyślnie co zwykle oznacza, że ​​będą wykonywane w zoptymalizowanym natywnym kodzie maszynowym. Jeśli myślisz o tym, jak możesz wiedzieć, który element jest najdłuższy, nie patrząc na każdego?


Wreszcie, należy pamiętać, że key=function nie jest funkcja, która jest specyficzna dla max. Wiele wbudowanych pytonów (max, min, sorted, itertools.groupby, ...) używa tego konkretnego argumentu ze słowem kluczowym. Zdecydowanie warto poświęcić trochę czasu, aby zrozumieć, jak to działa i co zwykle robi.

+0

Jak to działa? Ach, więc nie ma sposobu, żeby tego uniknąć? W porządku, dzięki! – IAmBatman

+0

@AmBatman Czy przeczytałeś dokumentację 'max'? Czy wiesz, że funkcje są pierwszymi wartościami klasy (co oznacza między innymi, że mogą być przekazywane do innych funkcji jako argumenty)? – delnan

+0

@AmBatman - 'max' stosuje funkcję' key' do każdego elementu listy i wybiera tę, w której funkcja 'key' zwróciła największą. – mgilson

10

Spróbuj zrozumieniem:

max(len(l) for l in L) 
+0

Myślę, że użycie słowa kluczowe "klucz" jest szybsze. –

+0

@MartijnPieters Prawdopodobnie widząc, że jest w C (PyPy ma problemy z optymalizacją wyrażeń generatora w niektórych przypadkach). Ale nie dlatego polecam. Jest to również dla mnie bardziej przejrzyste (ale to też jest w porządku, i zauważyłem, że bardziej pochylam się nad programowaniem funkcjonalnym niż wielu programistów Pythona). – delnan

+0

@MartijnPieters - Istnieją bardzo subtelne różnice. 'max (L, key = len)' daje obiekt z największym 'len', ale nie daje ci jego długości :) – mgilson

Powiązane problemy