2015-10-13 7 views
3

Предположим, у меня есть генератор gen, который дает некоторые списки. Я бы хотел найти самый длинный список.Поиск самого большого/самого маленького объекта в генераторе питона/список

я могу сделать

max((len(L) for L in gen)) 

который получит мне длину самого длинного списка, но в данный момент список уходит в глубину веков.

В качестве альтернативы я мог бы сделать

maxlength = 0 
for L in gen: 
    if len(L)>maxlength: 
     savelist = L 
     maxlength = len(L) 

Но, кажется, там должно быть более вещий способ, который позволяет избежать цикл и если заявление.

редактировать просто комментарий, чтобы помочь другим, которые могли бы найти похожие проблемы: найти наименьший объект с min можно сделать то же самое, и тот же подход будет работать, если gen список вместо этого.

ответ

6

max имеет аргумент key только для ключевого слова, который будет принимать функцию, с помощью которой можно судить о том, что является наибольшим.

result = max(gen, key=len) 

Это было бы эквивалентно что-то вроде:

result = [el for _, el in sorted([len(el), el for el in gen])][-1] 
# note that `sorted` takes a `key` argument too! 
# # result = sorted(gen, key=len)[-1] 

Но, очевидно, гораздо легче читать

+0

Это действительно эквивалент? 'max' должен только один раз перебирать элементы, а не сортировать их. – khelwood

+0

@khelwood нет, совсем нет, но он дает тот же результат –