Создание списка длин в одной строке Python

Быстрый вопрос... Вроде случайный.

Я хотел бы найти способ вернуть список, содержащий все длины элементов в отдельном списке в одной строке python... Используя python 3.8 ... Я попробовал следующее:

Список, над которым нужно работать (да, каждый индекс должен содержаться в своем собственном списке, я знаю, что это необычно или практично...):tmp =[['one'], ['two'], ['three']]

Код, который я пробовал:

lens = [len(item[a][0]) for a, item in enumerate(tmp)]

Возвращенная ошибка:

IndexError: list index out of range

...

Конечно, обычно такое утверждение:lens = [len(item) for item in tmp]здесь будет достаточно, и это отлично работает, если у нас есть список, не содержащий подсписок... Но мне бы очень понравилось, если бы я мог получить длину строки каждого подиндекса в одной строке.

Человек, который, как я представляю, спросит: нет, мне не нужно делать это одной строкой, но я начал дерзкий небольшой спор с другим другом программистом о самом быстром способе сделать это, и я хочу знать, возможно ли это всего за единственная строка. Я знаю, это непрактично.

Для меня имеет смысл, что во время вызова python еще не имеет значения для a или же item (объясняя мою ошибку индекса вне диапазона), потому что я надеюсь присвоить им значение через enumerate(tmp)... Ввод одного и того же кода строка за строкой, естественно, работает, поскольку enumerate может назначать a и item раз его назвали...

Но я не совсем понимаю, почему что-то вроде lens = [len(item) for item in tmp]будет работать, но это не так. Казалось бы, присвоение переменных происходит в том же порядке, не так ли? Я уже сталкивался с тем, что Python не очень хорош в обработке функций, возвращающих несколько значений / объектов... Может быть, это будет обновление в 3.9? Кто знает!

Ура! (:

2 ответа

Я считаю, что это ответ:

lens = [len(tmp[a][0]) for a, item in enumerate(tmp)]

В качестве альтернативы вы можете сделать это:

lens = [len(item[0]) for a, item in enumerate(tmp)]

В вашем коде a - это индекс, а item - это каждый отдельный элемент списка.

Ответ Карла Кнехтеля, указывающий мне на основы списков Python, решил это.

Мы можем использовать вложенный цикл:

lens = [len(row) for item in tmp for row in item]
Другие вопросы по тегам