2016-09-07 2 views
3

Они является продолжением вопрос к моей предыдущей публикации (повторной печати таблицы из списка списков)Как получить максимальную длину строки в списках вложенных

Я пытаюсь т получить строковое максимальное значение из следующих вложенный список:

tableData = [['apples', 'oranges', 'cherries', 'banana'], 
      ['Alice', 'Bob', 'Carol', 'David'], 
      ['dogs', 'cats', 'moose', 'goose']] 

for i in tableData: 
    print(len(max(i))) 

, который дает мне 7, 5, 5. Но "вишню" 8

какое мое здесь отсутствует? Спасибо.

ответ

4

Вы сделали длину максимального слова. Это дает неправильный ответ, потому что слова упорядочены lexicographically:

>>> 'oranges' > 'cherries' 
True 

То, что вы, вероятно, хотел это максимум длин слов:

max(len(word) for word in i) 

Или что то же самое:

len(max(i, key=len)) 
+0

большое спасибо. Так оно и было. –

+0

просто любопытно, как я также распечатываю максимальную строку так же, как и максимальную длину для каждого элемента? Спасибо –

+0

Я вполне уверен, что вы можете понять это сами! – wim

-1

Вы печатали длину максимального элемента в каждой строке. Python вычисляет строковый элемент max как тот, который рассматривается последним в словаре (лексикографическая сортировка). То, что вы хотите вместо этого max(len(s) for s in i) вместо len(max(i))

for row in tableData: 
    print(max(len(s) for s in row)) 
+1

извините за непонятность. Я хочу, чтобы максимальная длина строки из каждого элемента во вложенном списке. Так ожидалось увидеть: 8,5,5. –

+0

@ AT_1965: проверьте обновление – inspectorG4dget

0

В строковых операциях max будет возвращает максимальный алфавитный символ из строки не в основах длины. Так что вам нужно сделать что-то подобное.

len(max(sum(tableData,[]),key=len)) 

sum(tableData,[]) будет конвертировать list of list в list это помогает перебирать список списка.

Длина в каждой строке

In [1]: [len(max(i,key=len)) for i in tableData] 
Out[1]: [8, 5, 5] 

См разностное,

In [2]: max(sum(tableData,[])) 
Out[2]: 'oranges' 
In [3]: max(sum(tableData,[]),key=len) 
Out[3]: 'cherries' 
+0

Я не выбрал DV, но пользователю нужна максимальная длина в каждой строке - не по всей таблице. Кроме того, объединение списков с 'sum' бесполезно неэффективно, и большинство людей предпочитают использовать понимание или [цепочку] (https://docs.python.org/2/library/itertools.html#itertools.chain) для этого. – wim

+0

@wim Это правда, люди предпочитают только понимание, это самый эффективный метод. Я просто использовал 'sum', потому что это небольшая цель. И я обновил свой ответ для поиска каждой строки. И спасибо, что вы указали. –