Here’s a slightly more efficient solution (sorry it’s JavaScript). The key is to only store the length once, in your code you are making a calculation every time the length is increased by one “startLength[start] = 1 + cnt – start”.
By using the condition “if previous == 0 and r == 1” instead of your “if previous == 1 and r == 1”. I reduce the amount of calculations, but I also have to add a “if r == 1” after the for loop to catch the final case.
var test=[0,1,1,1,0,0,0,1,1,0,0,1,0];
function runs(arr) {
var result = {};
var start = 0;
var previous = 0;
var cnt = 0;
var r = 0;
for(; cnt<arr.length; cnt++) {
var r = arr[cnt];
if(r == 1 && previous == 0)
start = cnt;
if(r == 0 && previous == 1)
result[start] = cnt - start;
previous = r;
}
if(r == 1)
result[start] = cnt - start;
return result;
}
var result = runs(test);
for(var start in result)
console.log("start " + start + " length " + result[start]);
EDIT 2 Here’s a python benchmark showing that using the groupby function (currently the top answer to this question) is substantially slower.
from itertools import groupby
from operator import itemgetter
import random
import time
lst = [ 1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0]
def makeList(size):
random.seed()
return [random.randint(0,1) for r in xrange(size)]
def runs1(lst, showOutput):
startLength = {}
for k,v in groupby(enumerate(lst),key=itemgetter(1)):
if k:
v = list(v)
startLength[v[0][0]] = v[-1][0] + 1 - v[0][0]
if showOutput == True:
for s,l in startLength.iteritems():
print s,l
def runs2(lst, showOutput):
previous = 0
cnt = 0
startLength = {}
for r in lst:
if previous == 0 and r == 1:
start = cnt
if previous == 1 and r == 0:
startLength[start] = cnt - start
previous = r
cnt += 1
if r == 1:
startLength[start] = cnt - start
if showOutput == True:
for s,l in startLength.iteritems():
print s,l
testList = makeList(10)
print "slow version"
runs1(testList, True)
print "fast version"
runs2(testList, True)
benchmarkList = makeList(10000)
start = time.time()
runs1(benchmarkList, False)
print "slow ", time.time() - start
start = time.time()
runs2(benchmarkList, False)
print "fast ", time.time() - start
start = time.time()
runs1(benchmarkList, False)
print "slow ", time.time() - start
start = time.time()
runs2(benchmarkList, False)
print "fast ", time.time() - start
start = time.time()
runs1(benchmarkList, False)
print "slow ", time.time() - start
start = time.time()
runs2(benchmarkList, False)
print "fast ", time.time() - start
Skip to content
Задача «Длина последовательности»
Условие
Программа получает на вход последовательность целых неотрицательных чисел, каждое число записано в отдельной строке. Последовательность завершается числом 0, при считывании которого программа должна закончить свою работу и вывести количество членов последовательности (не считая завершающего числа 0). Числа, следующие за числом 0, считывать не нужно.
Решение задачи от разработчиков на Python:
Другое решение задачи на Python:
Смотреть видео — Задача «Длина последовательности» решение на Python
Делитесь с друзьями ссылкой на ответ и задавайте вопросы в комментариях! 👇
Related Posts
Функция len() в Python принимает объект в качестве аргумента и возвращает длину этого объекта. Например, функция len() может возвращать количество элементов в списке.
Синтаксис функции len() имеет следующий вид:
len(object)
Функция len()
принимает один аргумент, который может быть:
- последовательностью — строки, байтовые строки, итерируемые последовательности типа списка или кортежа;
- коллекцией — словари, множества, замороженные множества и так далее.
А возвращает len()
количество элементов в объекте, который передан в качестве аргумента.
Если мы не передаем никакого аргумента или аргумент имеет недопустимый тип, это вызовет исключение TypeError
.
Ошибка TypeError возникает, когда тип данных не является коллекцией или последовательностью. Например, логическое значение, int и т. д.
Например:
print(len(False)) print(len(1212))
Результат:
TypeError: object of type 'bool' has no len() TypeError: object of type 'int' has no len()
Давайте найдем количество элементов внутри списка, иными словами — длину списка.
fruits = ['Bananas', 'Apples', 'Mangoes'] # вычисляем длину списка фруктов l = len(fruits) # выводим длину списка на экран print(l) # Результат: # 3
Что собой представляет функция len() в Python?
len()
— это встроенная функция Python, которая принимает объект в качестве аргумента и возвращает его длину. Например, она может возвращать количество элементов в списке Python.
help(len)
Результат:
Help on built-in function len in module builtins: len(obj, /) Return the number of items in an object.
Всякий раз, когда мы используем встроенные и внешние типы данных с функцией len()
, она не производит итерацию по структуре данных. Длина объекта-контейнера хранится как атрибут данного объекта. Значение этого атрибута изменяется каждый раз, когда элементы добавляются или удаляются из структуры данных, и len()
просто возвращает данное значение. Это гарантирует, что функция len() работает быстро и эффективно.
Как применяется функция len()
Использование функции len() со встроенными последовательностями
Последовательность — это объект, содержащий элементы в упорядоченном виде. Списки, кортежи и строки являются основными примерами встроенных последовательностей в Python, а функция len() используется для вычисления длин этих последовательностей.
# Строка с именем name = "Andrew" print(len(name)) # 6 # Список продуктов food_items = ["Pizza", "Burger", "French Fries"] print(len(food_items)) # 3 # Кортеж с координатами coordinates = (51, 24) print(len(coordinates)) # 2 # Пустая строка print(len("")) # 0 # Пустой список print(len([])) # 0 # Пустой кортеж print(len()) # 0
Объяснение кода:
В приведенном выше фрагменте кода, чтобы найти длину строки name
, списка food_items
и кортежа coordinates
, мы используем len()
. Все эти три типа данных являются допустимыми аргументами для функции len()
. Данная функция возвращает целое число, так как подсчитывает количество элементов в объекте, который передается ей в качестве аргумента. Если аргумент является пустой последовательностью, функция len()
возвращает 0
.
Для создания последовательностей в определенном диапазоне мы также можем использовать функцию range()
. Данная функция не хранит свои значения, а генерирует их по мере необходимости. Однако мы можем найти длину такой последовательности при помощи функции len()
.
print(len(range(1, 10))) # Результат: # 9
Объяснение кода:
Этот диапазон чисел включает целые числа от 1 до 9 (10 исключается). Мы можем задавать длину объекта функции range()
, используя ее аргументы start
, stop
и step
.
Использование функции len() со встроенными коллекциями
Коллекции в Python — это типы данных, построенные на базе контейнеров. Это списки, множества, кортежи и словари. Все коллекции имеют определенные характеристики, основанные на их объявлении и использовании в программе. Например, списки объявляются в квадратных скобках. Они изменяемы, хранят повторяющиеся значения, а к их элементам можно обращаться при помощи индексов.
Пример 1. Определение длины коллекции, сгенерированной при помощи модуля random
В данном примере мы сначала используем функцию randint
модуля random
для создания списка случайных целых чисел, а затем применим функцию len()
, чтобы найти количество элементов в коллекции.
import random # Создаем список из 10 случайных чисел nums = [random.randint(1, 10) for _ in range(10)] print(nums) # Создаем множество, которое содержит только уникальные элементы списка unique = set(nums) # Выводим на экран множество и его длину print(unique) print(len(unique))
Результат:
[9, 1, 8, 6, 8, 8, 1, 9, 3, 10] {1, 3, 6, 8, 9, 10} 6
Объяснение кода:
В приведенной выше программе мы сгенерировали список из 10 случайных чисел в диапазоне от 1 до 10, используя представление списков. Результат будет отличаться при каждом новом запуске кода, поскольку мы генерируем случайные числа. В данном случае множество содержит 6 уникальных чисел.
Пример 2. Определение количества элементов в словаре
Словарь — это встроенный тип данных в Python, который используется для хранения элементов в виде пар ключ-значение. Когда мы используем словарь в качестве аргумента для len()
, функция возвращает количество элементов (пар ключ-значение) в словаре.
# Словарь, содержащий продукты питания print(len({"Potato": 10, "Onion": 12, "Tomato": 11})) # Пустой словарь print(len({})) # Результат: # 3 # 0
Объяснение кода:
В выводе первым мы получили число 3
. Это означает, что в словаре с продуктами есть три пары ключ-значение. Как и в случае с последовательностями, функция len()
возвращает 0
, если аргументом является либо пустой словарь, либо пустое множество.
Использование функции len() с другими встроенными типами данных
Типы данных, которые не хранят в себе более одного элемента, не могут использоваться в качестве аргумента для функции len()
.
print(len(False)) print(len(1))
Результат:
TypeError: object of type 'bool' has no len() TypeError: object of type 'int' has no len()
Целочисленные, вещественные, логические и сложные типы являются примерами встроенных типов данных, которые нельзя использовать с функцией len()
. Функция вызывает TypeError, когда в нее передается аргумент недопустимого типа данных.
Использование функции len() со сторонними библиотеками
Мы также можем использовать функцию len()
для объектов из различных сторонних библиотек. В этом разделе мы рассмотрим примеры использования len()
с типами данных из двух популярных библиотек — NumPy и pandas.
Пример 1. Использование функции len() с массивом NumPy
Библиотека NumPy используется для выполнения ресурсоемких задач и является строительным блоком для различных типов данных.
Применив функцию NumPy np.array(), мы можем создать объект типа <np.ndarray>
, используя переданный в качестве аргумента список.
import numpy as np nums = np.array([1, 7, 11, 2, 9, 25]) print(type(nums)) print(len(nums)) # Результат: # <class 'numpy.ndarray'> # 6
Объяснение кода:
Мы создали одномерный массив длины 6
, используя функцию np.array()
, и вычислили его тип и длину, используя функции type()
и len()
соответственно.
Пример 2. Использование функции len() с Pandas DataFrame
Pandas DataFrame — это двумерная структура данных с помеченными осями (строками и столбцами). Данные внутри Pandas DataFrame выровнены табличным образом по строкам и столбцам. Датафреймы (DataFrame) широко используются в машинном обучении, научных вычислениях и многих других областях, связанных с интенсивным использованием данных.
import pandas as pd # Создаем словарь marks = { "Ash": [60, 75, 90], "Gary": [78, 55, 87], "Max": [47, 96, 85], "Tyson": [68, 88, 69], } # Создаем из словаря датафрейм df = pd.DataFrame(marks, index=["Maths", "Physics", "Chemistry"]) print(df) # Выводим на экран длину датафрейма print(len(df)) # Выводим на экран размеры датафрейма print(df.shape)
Результат:
Ash Gary Max Tyson Maths 60 78 47 68 Physics 75 55 96 88 Chemistry 90 87 85 69 3 (3, 4)
Объяснение кода:
Ключи нашего словаря, содержащего отметки, представляют собой строки, являющиеся именами студентов. Значение каждого ключа представляет собой список, в котором хранятся оценки по трем предметам: математике, физике и химии.
При создании датафрейма с использованием этого словаря в качестве аргумента в функции pd.DataFrame()
мы также должны определить индекс, используя список, содержащий три учебных предмета.
Созданный датафрейм содержит три строки и четыре столбца. Функция len()
возвращает количество строк в датафрейме. Pandas DataFrame имеет свойство .shape
, которое можно использовать для вывода количества строк и столбцов датафрейма в кортеже из двух элементов.
Использование функции len() в пользовательских классах
Встроенная в Python функция len()
вызывает в нашем классе метод с именем __len__()
. Такие методы, имеющие двойное подчеркивание в начале и конце имени, называются магическими.
Реализация этого метода позволит вызову len()
работать с нашим классом. Если данный метод не будет реализован, вызов функции len()
завершится ошибкой AttributeError. Встроенная в Python функция len()
вызывает метод .__len__()
своего аргумента.
class Order: def __init__(self, count): self.count = count def __len__(self): return self.count myOrder = Order(7) print(len(myOrder)) # Результат: # 7
Объяснение кода:
В вышеприведенной программе есть класс Order
с атрибутом count
. Мы также реализовали магическую функцию __len__()
, которая возвращает общее количество заказов, переданных ей в качестве аргумента. Далее мы создали экземпляр нашего класса с именем myOrder
, передав в него аргумент count
, равный семи. И при вызове функции len() было возвращено значение данного атрибута.
Заключение
В данной статье мы рассмотрели, как использовать функцию len() в Python для определения количества элементов в последовательностях, коллекциях и сторонних типах данных.
Функция len() принимает объект в качестве аргумента и возвращает длину этого объекта.
Функцию len() можно использовать для:
- встроенных типов данных;
- типов данных из сторонних библиотек (например Numpy или pandas);
- заданных пользователем классов (для этого в классе необходимо реализовать магический метод
__len__()
);
Перевод статьи «len() Function in Python».
Синтаксис:
Параметры:
sequence
– последовательность. Могут бытьlist
,str
,tuple
,set
и т. д.
Результат:
- целое число, количество элементов
Описание:
Операция позволяет вычислить какое количество элементов содержит последовательность.
Результатом будет целое число, представляющее количество элементов в последовательности sequence
. Другими словами – это длина последовательности.
Эта операция поддерживаются большинством типов последовательностей, как изменяемых, так и неизменяемых.
Дополнительную информацию смотрите в описании встроенной функции len()
Примеры вычисления длины последовательности.
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> len(x) # 10 >>> x = 'Hello World' >>> len(x) # 11
Завантаження