Длина самого длинного слова в списке

Чем больше питоновский способ получить длину самого длинного слова:

len(max(words, key=len))

  • Как сжато каскадировать несколько операторов regex в Python
  • Или:

    max(len(w) for w in words)

    Или что-то другое? words – это список строк. Я нахожу, что мне нужно делать это часто и после выбора времени с несколькими различными размерами выборки, первый способ кажется последовательно более быстрым, несмотря на кажущуюся менее эффективную по номиналу (избыточность len которая называется дважды, кажется, не имеет значения – больше случается в коде C в этой форме?).

  • Экстренные пробелы при печати
  • Каков стандартный формат docstring Python?
  • Недопустимое имя пользователя Pylint
  • Какой лучший скелетный код модуля библиотеки Python?
  • Если соглашение в Python состоит в том, чтобы использовать классы, почему тогда list () не капитализируется? Разве это не класс?
  • Как аккуратно держать под шириной 80 символов с длинными строками?
  • 6 Solutions collect form web for “Длина самого длинного слова в списке”

    Я думаю, что все в порядке, но я думаю, что если скорость не является большим соображением, то max(len(w) for w in words) является наиболее читаемым.

    Когда я смотрел на них, мне потребовалось больше времени, чтобы понять, что делает len(max(words, key=len)) , и я все еще был не прав, пока не подумал об этом больше. Код должен быть немедленно очевиден, если нет веских оснований для этого не быть.

    Из других сообщений (и моих собственных тестов) видно, что менее читаемый быстрее. Но это не похоже на то, что одна из них – собака медленно. И если код не находится на критическом пути, это не стоит беспокоиться.

    В конечном счете, я думаю, что более читаемый более Pythonic.

    В стороне, это один из немногих случаев, когда Python 2 заметно быстрее, чем Python 3 для одной и той же задачи.

    Несмотря на то что:

     max(len(w) for w in words) 

    легче «читать» – у вас есть накладные расходы генератора.

    В то время как:

     len(max(words, key=len)) 

    может оптимизироваться с помощью ключа с помощью встроенных функций, и поскольку len обычно является очень эффективным оператором для строк, будет быстрее …

    Если вы переписываете выражение генератора в качестве вызова map (или для 2.x, imap ):

     max(map(len, words)) 

    … это на самом деле немного быстрее, чем ключевая версия, а не медленнее.

    python.org 64-бит 3.3.0:

     In [186]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100 In [188]: %timeit max(len(w) for w in words) %10000 loops, best of 3: 90.1 us per loop In [189]: %timeit len(max(words, key=len)) 10000 loops, best of 3: 57.3 us per loop In [190]: %timeit max(map(len, words)) 10000 loops, best of 3: 53.4 us per loop 

    Apple 64-bit 2.7.2:

     In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100 In [299]: %timeit max(len(w) for w in words) 10000 loops, best of 3: 99 us per loop In [300]: %timeit len(max(words, key=len)) 10000 loops, best of 3: 64.1 us per loop In [301]: %timeit max(map(len, words)) 10000 loops, best of 3: 67 us per loop In [303]: %timeit max(itertools.imap(len, words)) 10000 loops, best of 3: 63.4 us per loop 

    Я думаю, что это более питоновая, чем key версия, по той же причине, что и ген xp.

    Это спорно, является ли это, как вещий как версия genexp. Некоторым людям нравится map / filter / reduce / и т. Д .; некоторые ненавидят их; мое личное чувство заключается в том, что когда вы пытаетесь сопоставить функцию, которая уже существует и имеет хорошее имя (то есть, что-то вам не нужно lambda или partial ), map лучше, но YMMV (особенно, если ваше имя это Гвидо).

    Последний вопрос:

    избыточность len, называемая дважды, кажется, не имеет значения – больше ли происходит в коде C в этой форме?

    Подумайте об этом так: вы уже звоните len N раз. Называть его N+1 раз вместо этого вряд ли может иметь значение, по сравнению с тем, что вы должны делать N раз, если у вас нет крошечного количества огромных строк.

    я бы сказал

     len(max(x, key=len)) 

    выглядит неплохо, потому что вы используете key аргумент ( key ) встроенного ( max ) со встроенным ( len ). Таким образом, в основном max(x, key=len) дает вам почти ответ. Но ни один из ваших вариантов кода не выглядит особенно непифовым для меня.

    Только для информации, использующей ipython %timeit

     In [150]: words Out[150]: ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] In [148]: %timeit max(len(w) for w in words) 100000 loops, best of 3: 1.87 us per loop In [149]: %timeit len(max(words, key=len)) 1000000 loops, best of 3: 1.35 us per loop 

    Просто обновлено с большим количеством слов, чтобы продемонстрировать точку / комментарий @ Omnifarious.

     In [160]: words = map(string.rstrip, open('/usr/share/dict/words').readlines()) In [161]: len(words) Out[161]: 235886 In [162]: %timeit max(len(w) for w in words) 10 loops, best of 3: 44 ms per loop In [163]: %timeit len(max(words, key=len)) 10 loops, best of 3: 25 ms per loop 

    Я знаю, что прошло уже год, но, тем не менее, я придумал это:

    '' 'Напишите функцию find_longest_word (), которая принимает список слов и возвращает длину самого длинного.' ''

     a = ['mamao', 'abacate', 'pera', 'goiaba', 'uva', 'abacaxi', 'laranja', 'maca'] def find_longest_word(a): d = [] for c in a: d.append(len(c)) e = max(d) #Try "min" :D for b in a: if len(b) == e: print "Length is %i for %s" %(len(b), b) 
    Python - лучший язык программирования в мире.