В этом посте мы рассмотрим, как узнать число элементов в списке Python, удовлетворяющих определенным условиям или критериям.
Если вам просто нужно найти количество конкретных элементов с списке, используйте метод .count()
>>> list_numbers = [1, 2, 2, 5, 5, 7, 4, 2, 1]
>>> print(list_numbers.count(2))
3
Существует несколько способов такого подсчета, и мы изучим каждый из них с помощью примеров. Итак, давайте начнем.
1. Использование цикла for для подсчета в списке Python
В этом фрагменте кода мы используем цикл for для подсчета элементов списка Python, удовлетворяющих условиям или критериям. Мы перебираем каждый элемент списка и проверяем условие, если оно истинно, то мы увеличиваем счетчик на 1. Это простой процесс сопоставления и подсчета для получения интересующего нас количества.
list_numbers = [78, 99, 66, 44, 50, 30, 45, 15, 25, 20]
count = 0
for item in list_numbers:
if item%5 == 0:
count += 1
print("количество элементов списка, удовлетворяющих заданному условию:", count)
количество элементов списка, удовлетворяющих заданному условию: 6
2. Применение len() со списковыми включениями для подсчета в списке Python
В представленном ниже фрагменте кода, мы используем списковые включения (list comprehension), чтобы создать новый список, элементы которого соответствует заданному условию, после чего мы получаем длину собранного списка. Это намного легче понять на примере, поэтому давайте перейдем к нему.
list_numbers = [78, 99, 66, 44, 50, 30, 45, 15, 25, 20]
element_count = len([item for item in list_numbers if item%5 == 0])
print(
"количество элементов списка, удовлетворяющих заданному условию:",
element_count
)
количество элементов списка, удовлетворяющих заданному условию: 6
Подсчет ненулевых элементов
В этом примере мы находим общее количество ненулевых элементов. Чтобы узнать число нулевых членов списка, мы можем просто изменить условие на if item == 0
.
list_numbers = [78, 99, 66, 44, 50, 30, 45, 0, 0, 0]
element_count = len([item for item in list_numbers if item != 0])
print(
"количество элементов списка, удовлетворяющих заданному условию:",
element_count
)
количество элементов списка, удовлетворяющих заданному условию: 7
3. sum() и выражение-генератор для подсчета в списке Python
В этом примере кода мы используем sum()
с генераторным выражением. Каждый элемент списка проходит проверку условием и для тех элементов, которые ему удовлетворяют, возвращается значение True
. Метод sum()
в свою очередь подсчитывает общее число истинных значений.
list_numbers = [78, 99, 66, 44, 50, 30, 45, 15, 25, 20]
count = 0
count = sum(True for i in list_numbers if i % 5 == 0)
print(
"количество элементов списка, удовлетворяющих заданному условию:",
count
)
количество элементов списка, удовлетворяющих заданному условию: 6
4. sum() и map() для подсчета элементов списка Python с условиями или критериями
Функция map(fun, iterable)
принимает два аргумента: итерируемый объект (это может быть строка, кортеж, список или словарь) и функцию, которая применяется к каждому его элементу, — и возвращает map-объект (итератор). Для применения одной функции внутри другой идеально подходит лямбда-функция. Таким образом, map()
примет первый аргумент в виде лямбда-функции.
Здесь sum()
используется с функцией map()
, чтобы получить количество всех элементов списка, которые делятся на 5.
Давайте разберемся на примере, в котором переданная лямбда-функция предназначена для фильтрации членов списка, не кратных 5.
list_numbers = [78, 99, 66, 44, 50, 30, 45, 15, 25, 20]
count = 0
count = sum(map(lambda item: item % 5 == 0, list_numbers))
print(
"количество элементов списка, удовлетворяющих заданному условию:",
count
)
количество элементов списка, удовлетворяющих заданному условию: 6
5. reduce() с лямбда-функцией для подсчета элементов списка Python с условием или критериями
Lambda — это анонимная (без имени) функция, которая может принимать много параметров, но тело функции должно содержать только одно выражение. Лямбда-функции чаще всего применяют для передачи в качестве аргументов в другие функции или для написания более лаконичного кода. В этом примере мы собираемся использовать функции sum()
, map()
и reduce()
для подсчета элементов в списке, которые делятся на 5.
Приведенный ниже код наглядно демонстрирует это.
from functools import reduce
list_numbers = [78, 99, 66, 44, 50, 30, 45, 15, 25, 20]
result_count = reduce(
lambda count, item: count + (item % 5 == 0),
list_numbers,
0
)
print(
"количество элементов списка, удовлетворяющих заданному условию:",
result_count
)
количество элементов списка, удовлетворяющих заданному условию: 6
Надеюсь, что вы узнали о различных подходах к подсчету элементов в списке Python с помощью условия или критериев для фильтрации данных.
Удачного обучения!
Получение количества элементов в списке в Python – обычная операция. Например, вам нужно будет знать, сколько элементов в списке, когда вы его просматриваете. Помните, что списки могут содержать в качестве своих элементов комбинацию целых чисел, чисел с плавающей запятой, строк, логических значений, других списков и т. д:
# List of just integers
list_a = [12, 5, 91, 18]
# List of integers, floats, strings, booleans
list_b = [4, 1.2, "hello world", True]
Если мы посчитаем элементы list_a
, мы получим всего 5 элементов. Если мы сделаем то же самое для list_b
, мы получим 4 элемента.
Есть разные способы узнать количество элементов в списке. Подходы различаются, хотите ли вы считать вложенные списки как один элемент или все элементы во вложенных списках, или если вас интересуют только уникальные элементы и т.д.
Встроенная функция len()
Самый простой способ узнать количество элементов в списке – использовать встроенную Python функцию len()
.
Давайте посмотрим на следующий пример:
list_a = ["Hello", 2, 15, "World", 34]
number_of_elements = len(list_a)
print("Number of elements in the list: ", number_of_elements)
Результат:
Number of elements in the list: 5
Как следует из названия, функция len()
возвращает длину списка независимо от типов элементов в нем.
Использование цикла for
Другой способ сделать это – создать функцию, которая просматривает список с помощью цикла for
. Сначала мы инициализируем счетчик элементов равным 0, и каждый раз, когда выполняется итерация цикла, счет увеличивается на 1.
Цикл заканчивается, когда он перебирает все элементы, поэтому счетчик будет представлять общее количество элементов в списке:
list_c = [20, 8.9, "Hi", 0, "word", "name"]
def get_number_of_elements(list):
count = 0
for element in list:
count += 1
return count
print("Number of elements in the list: ", get_number_of_elements(list_c))
Запуск этого кода напечатает:
Number of elements in the list: 6
Это гораздо более подробное решение по сравнению с функцией len()
, но его стоит рассмотреть, поскольку позже в статье мы увидим, что ту же идею можно применить, когда мы имеем дело со списком списков. Кроме того, вы можете захотеть выполнить некоторую операцию либо над самими элементами, либо с операцией в целом, что в данном случае возможно.
Получить количество уникальных элементов в списке
Списки могут состоять из нескольких элементов, включая дубликаты. Если мы хотим получить количество элементов без дубликатов (уникальных элементов), мы можем использовать другую встроенную функцию set()
. Эта функция создает объект set
, который отклоняет все повторяющиеся значения.
Затем мы передаем это в функцию len()
, чтобы получить количество элементов в set
:
list_d = [100, 3, 100, "c", 100, 7.9, "c", 15]
number_of_elements = len(list_d)
number_of_unique_elements = len(set(list_d))
print("Number of elements in the list: ", number_of_elements)
print("Number of unique elements in the list: ", number_of_unique_elements)
Результат:
Number of elements in the list: 8
Number of unique elements in the list: 5
Мы видим, что в list_d
8 элементов, 5 из которых уникальны.
Список списков с использованием len()
Во введении мы увидели, что элементы списков могут иметь разные типы данных. Однако списки, в свою очередь, могут иметь списки в качестве своих элементов. Например:
list_e = [[90, 4, 12, 2], [], [34, 45, 2], [9,4], "char", [7, 3, 19]]
Если мы используем встроенную функцию len()
, списки считаются отдельными элементами, поэтому у нас будет:
number_of_elements = len(list_e)
print("Number of elements in the list of lists: ", number_of_elements)
Результат:
Number of elements in the list of lists: 6
Обратите внимание, что пустой список считается одним элементом. Если список в списке содержит более одного элемента, они не принимаются во внимание. Вот здесь for
и пригодится.
Получить количество элементов в списке, содержащем другие списки
Если мы хотим подсчитать все элементы внутри списка, содержащего другие списки, мы можем использовать цикл for
. Мы можем инициализировать переменную count= 0
и просмотреть список. На каждой итерации цикла count
увеличивается на длину этого списка.
Для получения длины воспользуемся встроенной функцией len()
:
list_e = [[90, 4, 12, 2], [], [34, 45, 2], [9,4], "char", [7, 3, 19]]
def get_all_elements_in_list_of_lists(list):
count = 0
for element in list_e:
count += len(element)
return count
print("Total number of elements in the list of lists: ", get_all_elements_in_list_of_lists(list_e))
Результат:
Total number of elements in the list of lists: 16
В этом примере следует отметить несколько важных моментов. Во-первых, на этот раз пустой список не повлиял на общий счет. Это связано с тем, что в каждом цикле мы учитываем длину текущего вложенного списка и, поскольку длина пустого списка равна 0, count
увеличивается на 0.
Однако вы можете видеть, что каждый символ строки "char"
учитывается в общем количестве элементов. Это связано с тем, что функция len()
воздействует на строку, возвращая все ее символы. Мы можем избежать этой ситуации, используя тот же подход, что и в разделе ниже, который также позволит нам иметь элементы, отличные от списков.
Еще один интересный способ сделать то же самое, что и в предыдущем примере, – использовать определение списка:
number_of_elements = sum([len(element) for element in list_e])
Эта строка, по сути, делает две вещи. Во-первых, он создает новый список, содержащий длины всех элементов исходного списка. В нашем случае это было бы так [4, 0, 3, 2, 4, 3]
. Во-вторых, он вызывает функцию sum()
, используя вновь созданный список в качестве параметра, который возвращает общую сумму всех элементов, давая нам желаемый результат.
Вложенные списки
Вложенные списки – это списки, которые являются элементами других списков. Внутри списков может быть несколько уровней:
list_f = [30, 0.9, [8, 56, 22, ["a", "b"]], [200, 3, [5, [89], 10]]]
Мы видим, что ["a", "b"]
содержится в списке [8, 56, 22, ["a", "b"]]
, который, в свою очередь, содержится в основном списке [30, 0.9,[200, 3, [5, [89], 10]]]
.
Опять же, мы инициализируем переменную count
равной 0. Если мы хотим получить общее количество элементов во вложенном списке, нам сначала нужно проверить, является ли элемент списком или нет. Если это так, мы выполняем цикл внутри списка и рекурсивно вызываем функцию до тех пор, пока не останутся вложенные списки. Все элементы, кроме списков (целые числа, строки и т.д.), увеличивают счетчик на 1.
Обратите внимание, что это также решение проблем, вызванных предыдущим подходом.
Давайте посмотрим на код для подсчета элементов во вложенных списках:
list_f = [30, 0.9, [8, 56, 22, ["a", "hello"]], [200, 3, [5, [89], 10]]]
def get_elements_of_nested_list(element):
count = 0
if isinstance(element, list):
for each_element in element:
count += get_elements_nested_list(each_element)
else:
count += 1
return count
print("Total number of elements in the nested list: ", get_elements_of_nested_list(list_f))
Запуск этого кода даст нам:
Total number of elements in the nested list: 12
Обратите внимание, что мы использовали встроенную функцию isinstance()
, которая проверяет, является ли первый аргумент экземпляром класса, заданного вторым аргументом. В приведенной выше функции он проверяет, является ли элемент списком.
Первый элемент является целым числом 30
, поэтому функция переходит к блоку else
и увеличивает счетчик на 1. Когда мы добираемся до [8, 56, 22, ["a", "hello"]]
, функция распознает список и рекурсивно просматривает его, чтобы проверить наличие других списков.
Вывод
Мы увидели, что в зависимости от типа списка, который у нас есть, есть разные способы получить количество элементов. len()
это определенно самая быстрая и простая функция, если у нас есть плоские списки.
При использовании вложенных списков элементы внутри списков не учитываются len()
. Для этого нам нужно перебрать весь список.
Учитывая отсортированный двоичный массив, эффективно подсчитайте общее количество единиц в нем.
Например,
Input: nums[] = [0, 0, 0, 0, 1, 1, 1]
Output: The total number of 1’s present is 3
Input: nums[] = [0, 0, 1, 1, 1, 1, 1]
Output: The total number of 1’s present is 5
Потренируйтесь в этой проблеме
Простым решением было бы запустить линейный поиск в массиве и найти первое вхождение 1. Результатом будет длина массива минус индекс первого вхождения 1. Проблема с этим подходом заключается в том, что его наихудший случай временная сложность O(n), куда n
это размер ввода.
Мы можем легко решить эту проблему в O(log(n)) время использования рекурсия воспользовавшись тем фактом, что ввод отсортирован (т. е. все 0, за которыми следуют все 1). Идея состоит в том, чтобы разделить массив на две половины и повторить для обеих половинок. Если последний элемент подмассива равен 0, то в нем присутствуют все 0, так как он отсортирован, и мы возвращаем 0 из функции. Если первый элемент массива равен 1, то все его элементы равны только единицам, поскольку массив отсортирован, и мы возвращаем общее количество элементов в этом разделе.
Алгоритм может быть реализован следующим образом на C, C++, Java и Python:
C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <stdio.h> // Функция для нахождения общего количества единиц в отсортированном двоичном массиве int count(int nums[], int n) { // если последний элемент массива равен 0, то единицы не могут // присутствовать, так как он отсортирован if (nums[n – 1] == 0) { return 0; } // если первый элемент массива равен 1, все его элементы // являются единицами только потому, что они отсортированы if (nums[0]) { return n; } // делим массив на левый и правый подмассивы и повторяем return count(nums, n/2) + count(nums + n/2, n – n/2); } int main(void) { int nums[] = { 0, 0, 0, 0, 1, 1, 1 }; int n = sizeof(nums) / sizeof(nums[0]); printf(“The total number of 1’s present is %d”, count(nums, n)); return 0; } |
Скачать Выполнить код
результат:
The total number of 1’s present is 3
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <vector> #include <algorithm> using namespace std; // Функция для нахождения общего количества единиц в отсортированном двоичном массиве int count(vector<int> const &nums) { return upper_bound(nums.begin(), nums.end(), 1) – lower_bound(nums.begin(), nums.end(), 1); } int main() { vector<int> nums = { 0, 0, 0, 0, 1, 1, 1 }; cout << “The total number of 1’s present is “ << count(nums); return 0; } |
Скачать Выполнить код
результат:
The total number of 1’s present is 3
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class Main { // Функция для нахождения общего количества единиц в отсортированном двоичном массиве public static int count(int[] nums, int left, int right) { // базовый вариант if (nums == null || nums.length == 0) { return 0; } // если последний элемент массива равен 0, то единицы не могут // присутствовать, так как он отсортирован if (nums[right] == 0) { return 0; } // если первый элемент массива равен 1, все его элементы // являются единицами только потому, что они отсортированы if (nums[left] == 1) { return (right – left + 1); } // делим массив на левый и правый подмассивы и повторяем int mid = (left + right) / 2; return count(nums, left, mid) + count(nums, mid + 1, right); } public static void main(String[] args) { int[] nums = { 0, 0, 0, 0, 1, 1, 1 }; System.out.println(“The total number of 1’s present is “ + count(nums, 0, nums.length – 1)); } } |
Скачать Выполнить код
результат:
The total number of 1’s present is 3
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Функция для нахождения общего количества единиц в отсортированном двоичном списке def count(nums, left=None, right=None): # Базовый вариант if not nums: return 0 # Инициализация слева и справа if left is None and right is None: left, right = 0, len(nums) – 1 #, если последний элемент в списке равен 0, единицы не могут # присутствует, так как он отсортирован if nums[right] == 0: return 0 #, если первый элемент в списке равен 1, все его элементы # единичны, так как он отсортирован if nums[left] == 1: return right – left + 1 # разделить список на левый и правый подсписки и повторить mid = (left + right) // 2 return count(nums, left, mid) + count(nums, mid + 1, right) if __name__ == ‘__main__’: nums = [0, 0, 0, 0, 1, 1, 1] print(‘The total number of 1’s present is’, count(nums)) |
Скачать Выполнить код
результат:
The total number of 1’s present is 3
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Способ 1.
str(4**255 + 2**255 - 255).count('1')
Приводим к строке, вызываем строковый метод подсчета символа.
Способ 2.
sum(1 for elem in bin(4**255+ 2**255 - 255)) if elem == '1')
Считаем количество единиц, так как функция bin переводит к строковому типу вида ‘0bxxx’, где xxx – цифры числа в двоичном представлении.
Способ 3.
Также существует несложный алгоритм.
4^255 = 2^(255 * 2)
степень двойки, будет обозначать единица в двоичном представлении данной суммы.
2^255
— аналогично.
С вычитанием интереснее, можно проследить следующую закономерность:
2^n - 2^m
— будет содержать n - m
единиц (проверьте это и докажите самостоятельно).
Отсюда сделаем следующий финт: -255 = -256 + 1 = -2^8 + 2^0
В итоге наше выражение: 2^(255 * 2) + 2^255 - 2^8 + 1
будет иметь 1 + (255 - 8) + 1
единицу, так как 2^255 - 2^8
четное число и значит нулевой бит у него будет нулевой и прибавление единицы добавит только единицу.
В этой статье мы рассмотрим, как определить количество элементов в объекте Python и при необходимости подсчитать их сумму. Также увидим, как подсчитать количество вхождений конкретного элемента.
Итак, представим, что у нас есть следующий массив:
По условию задачи мы хотим определить, сколько элементов в данном массиве, и какова сумма всех этих элементов.
В первую очередь, вспомним, что в языке программирования Python существует специальная функция, возвращающая длину списка, массива, последовательности и так далее — это len(x), где x — наша последовательность.
Если разобраться, длина последовательности из чисел — это одновременно и количество самих цифр, поэтому мы можем решить поставленную задачу следующим образом:
print(len(array)) 6 Press any key to continue . . .А для подсчёта суммы можем занести перечисление массива Python в цикл:
array = [6,2,7,4,8,1] sum = 0 for i in range(len(array)): sum = array[i] print(sum)В принципе, вопрос решён. Но, по правде говоря, перебор целочисленного массива с помощью цикла для получения суммы элементов массива — это, всё же, костыль)). Дело в том, что в Python существует встроенная функция sum(). Она вернёт нам сумму без лишних телодвижений.
def main(): array = [1,6,3,8,4,9,25,2] print(sum(array)) if name == 'main': main() 58 Press any key to continue . . .Python: количество вхождений конкретного элемента
Бывает, нам надо подсчитать число вхождений определённых элементов в списке и вернуть найденное значение. Для этого в Python есть метод count(). Вот его синтаксис:
Метод принимает аргумент x, значение которого нас интересует. И возвращает число вхождений интересующего элемента в список:
# объявляем список website_list = ['otus.ru','includehelp.com', 'yandex.by', 'otus.ru'] # подсчитываем вхождения 'otus.ru' count = website_list.count('otus.ru') print('otus.ru found',count,'times.') # подсчитываем вхождения 'yandex.by' count = website_list.count('yandex.by') print('yandex.by found',count,'times.')Итог будет следующим:
otus.ru found 2 times. yandex.by found 1 times.Также этот метод успешно работает и с кортежами:
# объявляем кортеж sample_tuple = ((1,3), (2,4), (4,6)) # условные вхождения (1,2) count = sample_tuple.count((1,2)) print('(1,2) found',count,'times.') # условные вхождения (1,3) count = sample_tuple.count((1,3)) print('(1,3) found',count,'times.')Результат:
(1,2) found 0 times. (1,3) found 1 times.Вот и всё, теперь вы знаете, как подсчитывать количество элементов в списке, массиве, кортеже в Python.