Генерация списка длин в одной строке Python

#python #python-3.x #enumerate #one-liner

#python #python-3.x #перечислять #однострочный

Вопрос:

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

Я хотел бы найти способ вернуть список, содержащий все длины элементов в отдельном списке в одной строке 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 or item (объясняя мою ошибку index out of range), потому что я надеюсь присвоить им значение через enumerate(tmp) … Естественно, работает ввод одного и того же кода построчно, поскольку enumerate может выполнять назначения a и item после его вызова…

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

Приветствия! (:

Комментарии:

1. lens = [len(item[0]) for item in tmp] ?

2. Когда вы это сделаете for a, item in enumerate(tmp) , какое значение вы ожидаете a получить в первый раз? Какое значение вы ожидаете item получить в первый раз? Что вы ожидаете item[a][0] оценить?

3. Что касается входных tmp =[['one'], ['two'], ['three']] данных, какими вы хотите, чтобы были выходные данные?

4. Почти, но это вернет только длину первого индекса, а также вернет значение 1, поскольку этот индекс указывает на список, длина которого составляет 1 элемент… Вот почему у меня был элемент [a][0] … Каждый вложенный список будет содержать только один элемент, поэтому индекс 0 является безопасной константой, но основной индекс должен повторяться.

5. @KarlKnechtel Вывод должен быть: [3, 3, 4] (длина каждой строки, содержащейся в каждом подиндексе)

Ответ №1:

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

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

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

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

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

Комментарии:

1. Я не проверял это, но я считаю, что вы правы

Ответ №2:

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

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

 lens = [len(row) for item in tmp for row in item]