291

I have a list of variable length and am trying to find a way to test if the list item currently being evaluated is the longest string contained in the list. And I am using Python 2.6.1

For example:

mylist = ['abc','abcdef','abcd']

for each in mylist:
    if condition1:
        do_something()
    elif ___________________: #else if each is the longest string contained in mylist:
        do_something_else()

Surely there's a simple list comprehension that's short and elegant that I'm overlooking?

user104997
  • 2,945
  • 2
  • 16
  • 7

6 Answers6

713

From the Python documentation itself, you can use max:

>>> mylist = ['123','123456','1234']
>>> print max(mylist, key=len)
123456
Paolo Bergantino
  • 466,948
  • 77
  • 516
  • 433
  • 2
    Won't work for Python 2.4. See [this post](http://bytes.com/topic/python/answers/37337-key-argument-max#post140122) and [this post](http://bytes.com/topic/python/answers/37337-key-argument-max#post140143) for code to implement under 2.4. – Kumba Aug 24 '12 at 01:40
  • 22
    It only returns the first longest string: for example, `print(max(["this", "does", "work"], key=len))` only returns `"this"` instead of returning all of the longest strings. – Anderson Green Jan 22 '14 at 00:55
  • ditto @AndersonGreen. Can the method be redeployed in a way that captures two+ elements of the list meeting the call (key) equally well? – David Shaked Jan 27 '16 at 18:39
  • Following up on my question from earlier, I've linked a response that remedies the first-item-if-all-else-equal problem... – David Shaked Jan 27 '16 at 19:12
  • @DavidShaked Of course, it is possible to [sort a list of strings by length](http://stackoverflow.com/questions/2587402/sorting-python-list-based-on-the-length-of-the-string) to obtain a list of the longest strings. – Anderson Green Jan 27 '16 at 20:14
  • 7
    To get every largest element, in linear time, you have to do `m=max(map(len,xs)); [x for x in xs if len(x) == m]`. I don't think it can be done nicely in one line. – Thomas Ahle Mar 29 '16 at 18:57
  • @ThomasAhle: Not "nicely", but you can abuse nested listcomp to avoid recomputing the `max` for every comparison: `[x for m in (max(map(len, xs)),) for x in xs if len(x) == m]`. The "outer loop" loops over the one-tuple with the `max` computed exactly once, which both avoids recomputing it and (on Py3) ensures `m` is a local variable, which can speed up the code a bit. – ShadowRanger Mar 07 '18 at 03:21
9
def longestWord(some_list): 
    count = 0    #You set the count to 0
    for i in some_list: # Go through the whole list
        if len(i) > count: #Checking for the longest word(string)
            count = len(i)
            word = i
    return ("the longest string is " + word)

or much easier:

max(some_list , key = len)
pableiros
  • 12,936
  • 11
  • 88
  • 94
8

What should happen if there are more than 1 longest string (think '12', and '01')?

Try that to get the longest element

max_length,longest_element = max([(len(x),x) for x in ('a','b','aa')])

And then regular foreach

for st in mylist:
    if len(st)==max_length:...
Elazar Leibovich
  • 31,610
  • 30
  • 120
  • 165
4

len(each) == max(len(x) for x in myList) or just each == max(myList, key=len)

HarryM
  • 1,877
  • 13
  • 7
4

To get the smallest or largest item in a list, use the built-in min and max functions:

 lo = min(L)
 hi = max(L)  

As with sort, you can pass in a "key" argument that is used to map the list items before they are compared:

 lo = min(L, key=int)
 hi = max(L, key=int)

http://effbot.org/zone/python-list.htm

Looks like you could use the max function if you map it correctly for strings and use that as the comparison. I would recommend just finding the max once though of course, not for each element in the list.

Sergey Bushmanov
  • 19,458
  • 6
  • 44
  • 60
Gavin H
  • 10,070
  • 2
  • 33
  • 40
0
def LongestEntry(lstName):
  totalEntries = len(lstName)
  currentEntry = 0
  longestLength = 0
  while currentEntry < totalEntries:
    thisEntry = len(str(lstName[currentEntry]))
    if int(thisEntry) > int(longestLength):
      longestLength = thisEntry
      longestEntry = currentEntry
    currentEntry += 1
  return longestLength