#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]