2012-12-20 3 views
9

Я делал функцию, которая возвращает самое длинное строковое значение из списка. Мой код работает, когда есть только одна строка с наибольшим количеством символов. Я попытался напечатать все самые длинные строки, если их было несколько, и я не хочу, чтобы их повторяли. Когда я запускаю это, он возвращает только «привет», в то время как я хочу, чтобы он возвращал «ohman» и «yoloo». Я чувствую, что проблема в строке if item not list:, но я пробовал все, и она не работает.Самые длинные строки из списка

list = ['hi', 'hello', 'hey','ohman', 'yoloo', 'hello'] 
def length(lists): 
    a = 0 
    answer = '' 
    for item in lists: 
     x = len(item) 
    if x > a: 
     a = x 
     answer = item 
    elif x == a: 
     if item not in list: 
      answer = answer + ' ' + item 
    return answer 
print length(list) 

ответ

22

Первый, мы можем найти максимальную длину любой строки в списке:

stringlist = ['hi', 'hello', 'hey','ohman', 'yoloo', 'hello'] 
#maxlength = max([len(s) for s in stringlist]) 
maxlength = max(len(s) for s in stringlist) # omitting the brackets causes max 
              # to operate on an iterable, instead 
              # of first constructing a full list 
              # in memory, which is more efficient 

Небольшое пояснение. Это называется list comprehension, что позволяет вам comprehend один список в качестве другого списка. Код [len(s) for s in stringlist] означает «создать список-подобный объект, беря stringlist, и для каждого s в этом списке, дайте мне вместо этого, len(s) (длина этой строки).

Так что теперь у нас есть список [2, 5, 3, 5, 5, 5]. Тогда . мы называем встроенную функцию max() на том, который будет возвращать 5

Теперь, что у вас есть, что максимальная длина, вы можете фильтровать исходный список:

longest_strings = [s for s in stringlist if len(s) == maxlength] 

Это делает так же, как он читает на английском языке: «Для каждой строки s в StringList, дайте мне эту строку s, если len(s) равно maxlength»

Наконец, если вы хотите, чтобы сделать результат уникальным, вы можно использовать set() constuctor для создания уникального набора: (. Мы призывающие list(), чтобы превратить его обратно в список после удаления дубликатов)

unique_longest_strings = list(set(longest_strings)) 


Это сводится к:

ml = max(len(s) for s in stringlist) 
result = list(set(s for s in stringlist if len(s) == ml)) 

Примечание: Не используйте переменную с именем list, как он переопределяет значение имени для list типа.

+0

Я думаю, что OP хочет, чтобы все строки имели максимальную длину, а не максимальную длину среди всех строк. – DSM

+0

@DSM, ах штопать. Я неправильно понял вопрос. –

+0

Просто добавьте '[s для s в stringlist if len (s) == maxlength]' до конца, и вы золотые –

0

Может быть, у вас есть miswrote линия if item not in list: и отступ неправильно, модифицированный, как показано ниже:

def length(lists): 
    a = 0 
    answer = "" 


    for item in lists: 
     x = len(item) 
     if x > a: 
      a = x 
      answer = item 
     elif x == a: 
      if item not in ans: 
       answer = answer + " " + item 
    return answer 

Но я думаю, что Джонатон Рейнхарт предоставил лучший метод.

+0

Я неправильно сделал это. Я ставил списки вместо ответа. Спасибо – fifiman

10

Я очень одобряю ответ Джонатана Рейнхарта, но я просто не мог его удержать ... Как насчет этого?

max(map(len, stringlist)) 

Нет необходимости писать переписку, это еще проще ...

+0

Спасибо. Это по-прежнему однострочный, и только для максимальной длины. –

+0

@ JonathonReinhart Да, вот почему я сказал, что я очень одобряю ваши ... Я просто хотел сравнить этот конкретный раздел кода ... не нужно изобретать колесо – PALEN

+0

Приятно видеть использование 'map' в сравнении, однако. –

0

У меня была такая же проблема. Я понял свое решение таким образом:

myList =['hi', 'hello', 'hey','ohman', 'yoloo', 'hello'] 
def get_longest_strings(myList): 
     longest=len(max(myList,key=len)) 
     for each in myList: 
       if(longest==len(each)): 
         #common_result is list to store longest string in list 
         common_result.append(each) 
     return common_result 
print(common_result) 
Смежные вопросы