Создание списка длин в одной строке 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]