Как я могу получить общее количество элементов в моем произвольно вложенном списке списков?
У меня есть список, присвоенный переменной my_list . Значение my_list равно [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]] . Мне нужно найти длину my_list , но len(my_list) возвращает только 3. Я хочу, чтобы он вернул 11. Существуют ли функции Python, которые будут возвращать полную длину вложенных списков my_list и все.
Я хотел бы, чтобы это работало не только для чисел, но и для строк.
7 ответов
Эта функция подсчитывает длину списка, считая любой объект, кроме списка, как длину 1 и рекурсивно обрабатывая элементы списка, чтобы найти сглаженную длину, и будет работать с любой степенью вложенности, вплоть до максимальной глубины стека интерпретаторов.
Примечание: в зависимости от того, как это будет использоваться, может быть лучше проверить, является ли элемент итеративным, чем проверять, имеет ли он тип list , чтобы правильно оценить размер кортежей и т. Д. Однако, проверка если объект является итеративным, побочным эффектом будет подсчет каждого символа в строке вместо указания длины строки 1, что может быть нежелательным.
По сути, вы ищете способ вычисления количества листьев в дереве.
Функция count_leaves подсчитывает листья в дереве, рекурсивно вычисляя значение branch_counts для ветвей, а затем суммирует эти результаты. Базовый случай, когда дерево представляет собой лист, который представляет собой дерево с 1 листом. Количество листьев отличается от длины дерева, которое является его количеством ветвей.
Работа со списками в Python

Список в Python представляет из себя упорядоченную коллекцию однотипных или не однотипных элементов и относится к типу данных list. Это когда в переменную заносится не одно значение, а сразу несколько, в виде списка. По аналогии с другими языками программирования, список очень похож на массив.
Например, нам нужно занести в переменные названия месяцев года. Согласитесь, что создавать отдельную переменную под каждый месяц, неэффективно.
january = январь
february = февраль
march = март
april = апрель
Когда можно создать одну переменную и присвоить ей все элементы списка.
Создать список в Python
Чтобы создать список, нужно переменной присвоить объект, состоящий из элементов. Строчные элементы списка в Python записываются в одинарных или двойных кавычках, через запятую и в квадратных скобках.
Убедимся, что мы действительно создали список.
Элементы с числовым типом данным, пишутся без кавычек.
price = [25, 10, 35, 45]
Список может состоять из элементов со смешанным типом данных.
mix = [True, 50, «Доброе утро»]
Вывод списка в Python
print(price)
[25, 10, 35, 45]
print(mix)
[True, 50, 'Доброе утро']
У списков есть свои методы (операции) работы с элементами списков, рассмотрим наиболее часто используемые.
Добавить элемент в список
Для того, чтобы добавить новый элемент в список, существует метод append(). Вызвать данный метод, можно путем прибавления точки к переменной. В качестве аргумента метод принимает объект, указанный в скобочках и добавляет его в конец списка.
count = [15, 10, 35]
count.append(40)
print (count)
[15, 10, 35, 40] // вывод результата на экран
Вложенные списки
В один список можно добавить другой список.
num = [15, 10, 35]
num.append([1, 2, 3])
print (num)
[15, 10, 35, [1, 2, 3]]
Удалить элемент из списка
Метод pop() удаляет последний элемент из списка.
Понятие индекса в списке
Мы научились добавлять и удалять из списка только последний элемент (если не передается аргумент). Но как быть, если необходимо добавить или удалить второй элемент из списка? В Python все элементы списка, расположены в нумерованной последовательности, где отсчет ведется с нуля. Это значит, что первый элемент в списке имеет индекс 0, второй — индекс 1, третий — индекс 2 и.т.д. В таком случае, зная индекс, мы можем обращаться к нужному элементу списка и производить над ним операции.
a = [3, 4, 5]
print (a[1]) // вывод второго элемента
4 // получили элемент из списка
Метод pop(), удаляет из списка по индексу 1, второй элемент списка. Число 3 вылетает из списка.
Изменить элементы в списке
Как изменить значение первого элемента списка? Получим первый элемент списка по индексу и присвоим ему новое значение.
x = [2, 3, 4]
x[0] = 10
print (x)
[10, 3, 4] // 2 заменилась на 10
Длина списка в Python
Длина списка — это количество элементов в списке, которое может динамически меняться. Как узнать длину списка? Метод len() возвращает длину списка, равную количеству его элементов.
Объединение списков
Списки можно объединять друг с другом.
[10, 11, 12] + [2, 3]
[10, 11, 12, 2, 3]
Заключение
В языке Python удивительно простой синтаксис, изучать этот язык программирования — приятное занятие. Узнайте из этой статьи, почему Python идеально подходит тем, кто никогда раньше не сталкивался с языками программирования.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 1 ):
Спасибо за статью Сэнсэй!
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Списки, кортежи и множества
На сегодняшнем занятии мы подробнее поговорим про три структуры данных в Питоне: списки, кортежи и множества. Каждая из них относится к так называемым коллекциям (collections), то есть структурам, содержащим сразу несколько элементов. При этом у каждой есть свои важные особенности.
Списки
Мы начали изучать списки на пятом занятии вводного курса. Продолжим эту работу.
Основы работы со списками
Список можно создать (или как правильнее говорить инициализировать) через пустые квадратные скобки [ ] или с помощью функции list().
Элементом списка может быть любой объект, например, число, строка, список или словарь.
Длину списка можно узнать с помощью функции len().
Индекс и срез списка
Как мы уже знаем, у списка есть индекс. Элементы списка индексируются так же, как символы в строке.
![]()
Рассмотрим пример со вложенными списками (nested list). Для того чтобы обратиться, например, к первому элементу второго вложенного списка нужно использовать двойной индекс [ 1 ] [ 0 ] .
Обратите внимание, мы начали с индекса вложенного списка [ ‘Игорь’ , 85000 ] в общем списке salary_list (как бы снаружи). Он соответствует [1]. Затем мы указали индекс первого элемента внутри вложенного списка [0].
Индекс элемента в списке можно узнать с помощью метода .index(). Предположим, мы хотим узнать индекс элемента ‘c’ в списке abc_list .
Метод .index() можно применить ко вложенному списку.
В случае если мы хотим получить срез списка, то так же как и в случае строк, мы указываем начало среза и элемент до которого (но не включая который) сделать срез.
У среза есть третий параметр — шаг. Он позволяет пропускать заданное количество элементов.
Кроме того, мы можем проверить содержится ли элемент в списке с помощью ключевого слова in.
Добавление, замена и удаление элементов списка
Мы уже умеем использовать метод .append(), который добавляет элемент в конец списка.
Метод .insert() позволяет добавить элемент в середину списка, при этом индекс последующих элементов сдвигается.
Элемент списка можно заменить по индексу.
Элемент можно удалить, указав либо его название, либо индекс.
Все эти операции возможны благодаря тому, что списки (1) упорядочены и (2) изменяемы.
Убедимся, что остался только понедельник.
Сложение списков
Добавить к списку еще один список можно с помощью метода .extend(). Мы с вами уже использовали его на занятии по обработке естественного языка.
Кроме того, два списка можно просто сложить (concatenate).
Добавлю, что иногда бывает полезно «размножить» элементы списка.
Такие «произведения» также можно складывать.
Распаковка списков
Ранее мы уже познакомились с возможностью распаковки списков (unpacking), то есть помещения элементов списка в переменные. Теперь посмотрим на этот функционал более внимательно.
Во-первых, элемент можно вывести по индексу и поместить в переменную.
Несколько элементов можно поместить сразу в несколько переменных. Количество передаваемых элементов можно регулировать срезом.
Если нас интересует только первый элемент списка, но мы не хотим использовать индекс, можно распаковать список в две переменные, пометив вторую символом *. В первую попадет первый элемент, во вторую — все остальные.
Аналогичным образом мы можем распаковать первый, *остальные и последний элементы списка.
Сортировка списков
Для сортировки списка можно использовать функцию sorted() и метод .sort(). Функция sorted() не изменяет объект и сразу выводит результат сортировки.
Впрочем, если записать результат вызова функции sorted() в переменную, изменение станет постоянным.
Метод .sort() изменяет сам объект, но результат сортировки нужно вывести отдельно.
Метод .reverse() задает обратный порядок элементов списка (объект также изменяется, результат по умолчанию не выводится).
Преобразование списка в строку
Мы с вами уже умеем разбивать строку на части и превращать в список. Иногда бывает полезно сделать обратное.
Возьмем список, состоящий из букв.
И преобразуем его в строку с помощью метода .join(). Обратите внимание, пространство между элементами списка мы ничем не заполняем и для этого оставляем кавычки пустыми » .
Конечно, мы можем указать любой другой межбуквенный элемент.
Арифметика в списках
Вновь создадим список, состоящий из чисел.
С помощью метода .count() мы можем посчитать частоту вхождения элемента в список.
Функции min(), max() и sum() позволяют рассчитать минимальное и максимальное значение, а также сумму элементов списка.
List comprehension
А теперь рассмотрим list comprehension. По сути, list comprehension позволяет превратить один список в другой, преобразовывая и отбирая элементы исходного списка.

Рассмотрим на примерах. Предположим, у нас есть список имен.
И на основе этого списка мы хотим создать новый список, в котором останутся только имена, начинающиеся с буквы «А». Очевидно, мы можем использовать цикл for.
List comprehension позволяет сделать то же самое, но в одну строку.
Немного изменив код, мы можем перевести все заглавные буквы имен исходного списка в строчные.
На основе этих двух примеров давайте разберемся с синтаксисом list comprehension.

- Вначале идет выражение, преобразующее каждый элемент исходного списка.
- Если просто указать переменную, как это было в первом примере с переменной name , элементы перейдут из исходного списка в новый без изменений.
- Во втором примере, мы изменили регистр с заглавной буквы на строчную с помощью метода .lower().
Приведу еще один пример.
Как вы видите, здесь схема немного изменилась. Интерпретировать эту запись можно следующим образом:
- name if name != ‘Виктор’ — оставь элемент в списке без изменений, если он не совпадает с именем «Виктор»
- else ‘Вадим’ — в противном случае (т.е. если совпадает), замени на Вадим
- for name in names — сделай все это, проходясь по элементам исходного списка
Также напомню, что мы уже использовали list comprehension на занятии по обработке естественного языка. Мы брали список слов после лемматизации.
И применяли стеммер к каждому из элементов списка с помощью list comprehension.
Кортежи
Кортеж (tuple) инициализируется при помощи круглых скобок ( ) или функции tuple().
Во многом кортеж похож на список. Это также упорядоченный набор элементов с индексом, начинающимся с нуля.
Основное отличие от списка — кортеж неизменяем. После того как кортеж создан, добавлять или удалять элементы нельзя.
Например, заменить элемент по его индексу нельзя.

Для этого придется вначале преобразовать кортеж в список.
Создать кортеж из одного элемента можно с помощью запятой.
Если запятую не ставить, получится строка.
Функция enumerate()
Если с функцией enumerate() использовать не две, как мы делали раньше, а одну переменную, результатом ее работы будет кортеж, состоящий из индекса и соответствующего элемента списка.
Просмотр элементов словаря
Аналогично, если в цикле for к словарю применить знакомый нам метод .items() и использовать только одну переменную, мы получим кортежи из ключа и значения.
Распаковка кортежей
Распаковать кортеж значит поместить каждый из его элементов в отдельную переменную.
Кортежи удобно распаковывать в цикле for.
С элементами словаря получается то же самое.
Здесь на самом деле ничего нового для нас нет.
Создание кортежа через функцию zip()
Функция zip() принимает два и более списков и формирует объект из кортежей. В первом кортеже содержатся первые элементы каждого из списков, во втором — вторые и так далее.

Получившийся zip-объект нужно преобразовать в список.
Множества
Про множества важно запомнить три факта:
- Элементы множества изменять нельзя
- Множество — это набор уникальных элементов, а значит повторы в нем удаляются
- У множества нет индекса, элементы не упорядочены
Создание множества
Множество можно создать с помощью функции set() или перечислив элементы в фигурных скобках < >.
Обратите внимание, Питон вывел элементы множества не в том порядке, в котором они были изначально записаны, и кроме того удалил повторяющийся элемент ‘c’ .
Это опять же говорит об уникальности и неупорядоченности элементов множества.
Пустыми фигурные скобки оставлять нельзя. Это способ создания словаря.
Добавление и удаление элементов
Как уже было сказано, изменять элементы множества нельзя. При этом нам ничто не мешает их добавлять или удалять. Предположим, мы начали создавать множество гласных букв в русском языке.
Метод .add() позволяет добавить элемент во множество. Например, букву «я».
Несколько элементов можно добавить с помощью метода .update().
Если мы по ошибке добавим согласную букву, например, «щ».
Ее можно удалить с помощью метода .remove().
Теория множеств в Питоне
Разумеется, объект множества в Питоне согласуется с математической теорией множеств (set theory).
Основные понятия
В частности, мы знаем, что равные множества — это множества, состоящие из одних и тех же элементов (при этом порядок элементов не важен). Питон позволяет это проверить.
Мощность множества или его кардинальное число отражает количество элементов множества и рассчитывается с помощью знакомой нам функции len().
Мы также можем проверить принадлежность элемента определенному множеству.
Подмножество и надмножество
Одно множество, назовем его A, называется подмножеством (subset) другого множества B, если все элементы множества A также принадлежат и множеству B. Питон позволяет это проверить с помощью метода .issubset().
Множество B называется надмножеством (superset) A, если A является подмножеством B. По сути, это обратная логическая операция, для которой есть метод .issuperset().
Объединение, пересечение и разность множеств
Теперь давайте поговорим про объединение, пересечение и разность множеств. Предположим, у нас есть две команды инженеров машинного обучения, одна занимается обработкой естественного языка (nlp), другая — компьютерным зрением (cv). Некоторые занимаются и тем, и другим.
Объединение множеств (union) отражает логическую операцию ИЛИ и нашем случае мы выберем тех специалистов, которые состоят хотя бы в одной команде. Другими словами, принадлежат или одному, или другому множеству, или обоим сразу.
Как мы видим есть два способа задать объединение множеств: через метод .union() или с помощью символа | . Аналогичные возможности есть и для других операций с множествами.
На диаграмме Эйлера это будут и те, кто входит в круг cv, и те, кто входит в nlp, и их пересечение.

При пересечении множеств (intersection) осуществляется логическая операция И. Мы выбираем только тех людей, которые работают в обеих командах, т.е. принадлежат обоим множествам.
Подсчет количества элементов во вложенном списке
Я пытаюсь подсчитать количество элементов во вложенном списке, список выглядит так:
Этот код используется для получения этого вывода:
Использование следующего кода работает, и просто вычитание одного работает:
Поскольку первый элемент списка всегда содержит один элемент. Я ищу более жесткое решение.
Предоставить мне хорошую ссылку тоже было бы здорово, я просто не могу найти ничего для себя.
3 ответа
Если вы ищете количество авторов в год, вы можете использовать это:
Или, если вы ищете количество уникальных авторов, вы можете использовать это:
Дает вам этот набор:
Так len(unique_authors) дает вам счет 28 ,
В любом случае, я думаю, что дальнейший путь для вас может заключаться в том, чтобы использовать некоторую комбинацию из списочных или словесных понятий.
Что вам нужно, это рекурсия. Функция, которая вызывает себя. Проверяйте тип во время итерации по списку, и если его другой список рекурсивно подсчитывает элементы внутри. Посмотрите ниже должно сделать свое дело. Это будет работать независимо от того, сколько вложенных списков у вас есть и насколько глубоко вам нужно идти. Вы также можете сосчитать вложенные кортежи и диктанты, хотя если вам не нужно проверять их, я бы их удалил.