Как мне узнать количество элементов в списке?

avatar
y2k
11 ноября 2009 в 00:30
3478142
12
2093

Учтите следующее:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

# FAKE METHOD:
items.amount()  # Should return 3

Как узнать количество элементов в списке items?

Источник
Aaron Hall♦
31 октября 2016 в 14:37
30

Вы, очевидно, запрашиваете количество элементов в списке. Если поисковик приходит сюда, чтобы узнать размер объекта в памяти, это фактический вопрос и ответы, которые они ищут: Как определить размер объекта в Python?

Ответы (12)

avatar
gnud
11 ноября 2009 в 00:33
2803

Функция len() может использоваться с несколькими различными типами в Python - как встроенными, так и библиотечными типами. Например:

>>> len([1, 2, 3])
3
avatar
DS_ShraShetty
18 апреля 2022 в 13:45
0

Как найти длину списка в Python

Список в Python реализован для хранения последовательности различных типов данных, которые упорядочены и могут быть изменены, он также может иметь повторяющиеся значения. Здесь у Python есть три метода определения длины списка:

  1. len()

Это встроенная функция len() для получения общего количества элементов в списке. Метод len() принимает аргумент, в котором вы можете предоставить список, и возвращает длину данного списка. Это самый удобный способ найти длину списка в Python.

    #Finding length of list by using len() method
    list_example = [1, 2, 3, 4, 5,6,7,8,9]
    print("The length of list is: ", len(list_example))
    The output will be:
    
    Output:
    The length of list is:  9
  1. Наивный метод

длина списка может быть легко найдена с помощью цикла for, и этот метод называется наивным методом. Его можно резюмировать следующим образом:

Во-первых, объявите переменную-счетчик и инициализируйте ее нулем.

Используя цикл for, пройдитесь по всем элементам данных и, встретив каждый элемент, увеличьте значение счетчика на 1.

Теперь длина массива будет храниться в переменных счетчика и будет представлять количество элементов в списке.

#Finding length of list by using Naive method
#Initializing list
list_example = [1, 2, 3, 4, 5,6,7,8,9]
print("The list is: ", str(list_example))
#finding length of list using loop
counter = 0
for i in list_example:
    counter = counter + 1
print ("Length of list using Naive Method is: ", str(counter))
  1. length_hint()

Этот метод определен в классе операторов, и он также может определять длину списка.

#Using Length_hint() Method
from operator import length_hint
list_len_1 = [1, 2, 3, 5, 6, 'PickupBrain']
list_len_hint = length_hint(list_len_1)
print(list_len_hint)

Тест производительности len(), наивного метода и методов length_list

Этот временной анализ поможет понять, сколько времени требуется для выполнения всех методов, что поможет вам выбрать один из них.

#Code for Performance Analysis
from operator import length_hint
import time
#define list
list_example = [1, 2, 3, 4, 5,6,7,8,9]
print("The list is: ", list_example)
# Using Naive method & loop to find length of list
# Initializing counter
start_naive_time = time.time()
counter = 0
for i in list_example:
    counter = counter + 1
    end_naive_time = float(time.time() - start_naive_time)
# Using len() method
start_len_time = time.time()
list_len = len(list_example)
end_len_time = float(time.time()- start_len_time)
# Using length_hint() method
start_hint_time = time.time()
list_hint = length_hint(list_example)
end_hint_time = float(time.time()- start_hint_time)
#Printing time for each method
print("Time taken by Naive Method: ", end_naive_time)
print("Time taken by Length_hint() Method: ", end_len_time)
print("Time taken by len() Method: ", end_hint_time)
The output will be this:

Output:

The list is:  [1, 2, 3, 4, 5, 6, 7, 8, 9]
Time taken by Naive Method:  3.0994415283203125e-06
Time taken by Length_hint() Method:  4.76837158203125e-07
Time taken by len() Method:  1.1920928955078125e-06

Заключение Затраченное время Наивный метод >> len() >length_hint()

avatar
Tamil Selvan
5 января 2022 в 19:00
3

Есть три способа найти длину элементов в списке. Я сравню 3 метода с анализом производительности здесь.

Метод 1: Использование len()

items = []
items.append("apple")
items.append("orange")
items.append("banana")

print(len(items))

выход:

3

Метод 2: Использование простого метода счетчика

items = []
items.append("apple")
items.append("orange")
items.append("banana")

counter = 0
for i in items:
    counter = counter + 1

print(counter)

выход:

3

Метод 3: Использование length_hint()

items = []
items.append("apple")
items.append("orange")
items.append("banana")

from operator import length_hint
list_len_hint = length_hint(items)
print(list_len_hint)

вывод:

3

Анализ производительности — наивное сравнение с len() и length_hint()

Примечание. Для сравнения я изменяю входной список на большой набор, который может дать хорошую разницу во времени для сравнения методов.

items = list(range(100000000))

# Performance Analysis
from operator import length_hint
import time

# Finding length of list
# using loop
# Initializing counter

start_time_naive = time.time()
counter = 0
for i in items:
    # incrementing counter
    counter = counter + 1
end_time_naive = str(time.time() - start_time_naive)

# Finding length of list
# using len()
start_time_len = time.time()
list_len = len(items)
end_time_len = str(time.time() - start_time_len)

# Finding length of list
# using length_hint()
start_time_hint = time.time()
list_len_hint = length_hint(items)
end_time_hint = str(time.time() - start_time_hint)

# Printing Times of each
print("Time taken using naive method is : " + end_time_naive)
print("Time taken using len() is : " + end_time_len)
print("Time taken using length_hint() is : " + end_time_hint)

Вывод:

Time taken using naive method is : 7.536813735961914
Time taken using len() is : 0.0
Time taken using length_hint() is : 0.0

Вывод

Отчетливо видно, что время, необходимое для наивного анализа, очень велико по сравнению с двумя другими методами, поэтому len() и length_hint() являются лучшим выбором для использования.

avatar
Alan Bagel
2 апреля 2021 в 23:09
2

Вы можете использовать функцию len(), чтобы найти длину итерации в python.

my_list = [1, 2, 3, 4, 5]
print(len(my_list))  # OUTPUT: 5

Функция len() также работает со строками:

my_string = "hello"
print(len(my_string))  # OUTPUT: 5

Итак, в заключение, len() работает с любой последовательностью или коллекцией (или объектом любого размера, который определяет __len__).

avatar
Comsavvy
22 декабря 2020 в 01:31
4

Чтобы получить количество элементов в любом последовательном объекте, ваш метод goto в Python равен len(), например,

a = range(1000) # range
b = 'abcdefghijklmnopqrstuvwxyz' # string
c = [10, 20, 30] # List
d = (30, 40, 50, 60, 70) # tuple
e = {11, 21, 31, 41} # set

len() метод может работать со всеми вышеуказанными типами данных, потому что они являются итеративными, т.е. вы можете выполнять итерацию по ним.

all_var = [a, b, c, d, e] # All variables are stored to a list
for var in all_var:
    print(len(var))

Грубая оценка метода len ()

def len(iterable, /):
    total = 0
    for i in iterable:
        total += 1
    return total
wjandrea
24 июня 2021 в 14:05
0

"любая итерация" - это неверно. Я думаю, вы имеете в виду «любую последовательность». Генераторы, например: len(x for x in range(8)) -> TypeError: object of type 'generator' has no len().

Comsavvy
26 июня 2021 в 08:38
0

Спасибо за это! Также следует учитывать такой вид generator.

avatar
Code Carbonate
3 июля 2020 в 03:24
3

В python есть встроенная функция len (), которая поможет в этих условиях.

a=[1,2,3,4,5,6]
print(len(a))     #Here the len() function counts the number of items in the list.

Вывод:

>>> 6

В случае строки (ниже) это будет работать немного иначе:

a="Hello"
print(len(a)) #Here the len() function counts the alphabets or characters in the list.

Вывод:

>>> 5

Это связано с тем, что переменная (a) является строкой, а не списком, поэтому она будет подсчитывать количество символов или алфавитов в строке, а затем печатать результат.

avatar
Alec
25 мая 2019 в 03:09
2

С точки зрения того, как на самом деле работает len(), это его реализация C:

static PyObject *
builtin_len(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
{
    Py_ssize_t res;

    res = PyObject_Size(obj);
    if (res < 0) {
        assert(PyErr_Occurred());
        return NULL;
    }
    return PyLong_FromSsize_t(res);
}

Py_ssize_t - максимальная длина, которую может иметь объект. PyObject_Size() - это функция, которая возвращает размер объекта. Если он не может определить размер объекта, он возвращает -1. В этом случае будет выполнен этот блок кода:

    if (res < 0) {
        assert(PyErr_Occurred());
        return NULL;
    }

И в результате возникает исключение. В противном случае будет выполнен этот блок кода:

    return PyLong_FromSsize_t(res);

res, которое является целым числом C, преобразуется в Python int (который по-прежнему называется «Long» в коде C, потому что Python 2 имеет два типа для хранения целых чисел) и возвращается.

cs95
5 июня 2019 в 03:37
5

Почему важно знать или знать о реализации C?

MSeifert
15 ноября 2019 в 08:16
0

Поскольку этот вопрос не относится к CPython, этот ответ может вводить в заблуждение. PyPy, IronPython, ... могут и реализуют это по-разному.

Boris
12 января 2021 в 17:12
0

Это бесполезный ответ, поскольку он просто говорит «len вызывает PyObject_Size()» и не говорит о том, что это делает, а именно «PyObject_Size() вызывает sq_length или PyMapping_Size для переданного объекта. "

avatar
Jonathan Komar
6 декабря 2017 в 18:14
10

А для полноты (в первую очередь образовательной) это возможно без использования функции len(). Я бы не стал мириться с этим как с хорошим вариантом НЕ ПРОГРАММИРУЙТЕ ТАКОЕ В PYTHON , но он служит цели для изучения алгоритмов.

def count(list):
    item_count = 0
    for item in list[:]:
        item_count += 1
    return item_count

count([1,2,3,4,5])

(Индексирование с двоеточием в list[:] неявно и, следовательно, также необязательно.)

Урок для начинающих программистов: нельзя получить количество элементов в списке, не посчитав их в какой-то момент. Возникает вопрос: когда лучше их пересчитать? Например, высокопроизводительный код, такой как системный вызов connect для сокетов (написанный на C) connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);, не вычисляет длину элементов (возлагая эту ответственность на вызывающий код). Обратите внимание, что длина адреса передается, чтобы сначала сохранить шаг подсчета длины? Другой вариант: с вычислительной точки зрения может иметь смысл отслеживать количество элементов по мере их добавления в передаваемый объект. Учтите, что это занимает больше места в памяти. См. Ответ Нафтули Кей.

Пример отслеживания длины для повышения производительности, при этом занимая больше места в памяти. Обратите внимание, что я никогда не использую функцию len (), потому что длина отслеживается:

class MyList(object):
    def __init__(self):
        self._data = []
        self.length = 0 # length tracker that takes up memory but makes length op O(1) time
        

        # the implicit iterator in a list class
    def __iter__(self):
        for elem in self._data:
            yield elem
            
    def add(self, elem):
        self._data.append(elem)
        self.length += 1
            
    def remove(self, elem):
        self._data.remove(elem)
        self.length -= 1
            
mylist = MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)
print(mylist.length) # 3
mylist.remove(3)
print(mylist.length) # 2
Granny Aching
30 апреля 2019 в 19:13
1

Почему for item in list[:]:? Почему не for item in list:? Кроме того, я бы использовал += 1 для увеличения.

Jonathan Komar
2 мая 2019 в 06:29
1

@GrannyAching Я явно упомянул необязательное двоеточие (спецификатор диапазона). Я оставил спецификатор диапазона в образовательных целях - полезно знать, что он подразумевается. Тип списка [] также выводится, как вы предлагаете, что эквивалентно моему коду. Оператор инкремента также эквивалентен добавлению 1 к существующей переменной, но короче во всех случаях. Так что я согласен, что его следует использовать, если вы так рассуждаете. В любом случае этот код не следует запускать в производство (кроме обучения программированию).

Kirk Strauser
8 декабря 2020 в 21:56
3

Если мы идем по кроличьей норе «не делай этого, но это весело», я предлагаю length = max(enumerate(list))[0] + 1.

Jonathan Komar
15 мая 2021 в 19:51
2

@KirkStrauser Ха-ха, я смеялся над этим умным избеганием на len()

avatar
MSeifert
7 апреля 2017 в 19:03
22

Помимо len, вы также можете использовать operator.length_hint (требуется Python 3.4+). Для обычного list оба эквивалента, но length_hint позволяет получить длину итератора списка, который может быть полезен в определенных обстоятельствах:

>>> from operator import length_hint
>>> l = ["apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3

>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3

Но length_hint по определению является только «подсказкой», поэтому в большинстве случаев len лучше.

Я видел несколько ответов, предлагающих доступ к __len__. Это нормально при работе со встроенными классами, такими как list, но это может привести к проблемам с пользовательскими классами, потому что lenlength_hint) реализуют некоторые проверки безопасности. Например, оба не допускают отрицательной длины или длины, превышающей определенное значение (значение sys.maxsize). Так что всегда безопаснее использовать функцию len вместо метода __len__!

avatar
Shai Alon
14 июля 2015 в 08:36
9

Отвечая на ваш вопрос в примерах, также приведенных ранее:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

print items.__len__()
Aaron Hall♦
26 октября 2016 в 15:10
17

В Python имена, начинающиеся с подчеркивания, являются семантически закрытыми методами и не должны использоваться пользователями.

Shai Alon
4 декабря 2016 в 16:30
3

1. __foo__: это просто соглашение, способ для системы Python использовать имена, которые не будут конфликтовать с именами пользователей. 2. _foo: это просто соглашение, способ для программиста указать, что переменная является частной (что бы это ни значило в Python). 3. __foo: это имеет реальное значение: интерпретатор заменяет это имя на _classname__foo, чтобы гарантировать, что имя не будет перекрываться с аналогичным именем в другом классе. * Никакая другая форма подчеркивания не имеет значения в мире Python. * В этих соглашениях нет разницы между классом, переменной, глобальным и т. Д.

Aaron Hall♦
4 декабря 2016 в 18:42
4

В этом разделе вопросов и ответов объясняется, почему вам не следует использовать специальные методы непосредственно как пользователь: coderhelper.com/q/40272161/541136

Shai Alon
28 февраля 2017 в 11:39
0

@AaronHall, но для функции len почти то же самое. Это может быть быстрее для очень больших переменных. Однако я понимаю вашу точку зрения, и мы должны использовать len (obj), а не obj .__ len __ ().

avatar
Aaron Hall
25 ноября 2014 в 21:51
265

Как узнать размер списка?

Чтобы узнать размер списка, используйте встроенную функцию len:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

А теперь:

len(items)

возвращает 3.

Пояснение

Все в Python является объектом, включая списки. Все объекты имеют какой-то заголовок в реализации C.

Списки и другие подобные встроенные объекты с «размером» в Python, в частности, имеют атрибут с именем ob_size, в котором кэшируется количество элементов в объекте. Таким образом, проверка количества объектов в списке выполняется очень быстро.

Но если вы проверяете, равен ли размер списка нулю, не используйте len - вместо этого поместите список в логический контекст - он обрабатывается как False, если он пуст, и как True в противном случае.

Из документов

len(s)

Возвращает длину (количество элементов) объекта. Аргументом может быть последовательность (например, строка, байты, кортеж, список или диапазон) или коллекция (например, словарь, набор или замороженный набор).

len реализован с помощью __len__ из модели данных docs:

object.__len__(self)

Вызывается для реализации встроенной функции len(). Должен возвращать длину объекта, целое число> = 0. Кроме того, объект, который не определить метод __nonzero__() [в Python 2 или __bool__() в Python 3], и чей метод __len__() возвращает ноль считается ложным в логическом контексте.

И мы также видим, что __len__ - это метод списков:

items.__len__()

возвращает 3.

Встроенные типы, вы можете получить len (длина) из

И на самом деле мы видим, что можем получить эту информацию для всех описанных типов:

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            range, dict, set, frozenset))
True

Не используйте len для проверки на пустой или непустой список

Чтобы проверить определенную длину, конечно, просто проверьте на равенство:

if len(items) == required_length:
    ...

Но есть особый случай для проверки списка нулевой длины или обратного. В этом случае не выполняйте проверку на равенство.

Также не делайте:

if len(items): 
    ...

Вместо этого просто выполните:

if items:     # Then we have some items, not empty!
    ...

или

if not items: # Then we have an empty list!
    ...

Я объясняю, почему здесь, но вкратце, if items или if not items более читабельны и более производительны.

avatar
Naftuli Kay
19 апреля 2013 в 21:51
75

Хотя это может быть бесполезно из-за того, что это имело бы гораздо больший смысл, поскольку это была бы "нестандартная" функциональность, довольно простой способ взлома - создать класс со свойством length:

class slist(list):
    @property
    def length(self):
        return len(self)

Вы можете использовать его так:

>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

По сути, он в точности идентичен объекту списка с дополнительным преимуществом в виде удобного для ООП свойства length.

Как всегда, ваш пробег может отличаться.

Tadhg McDonald-Jensen
13 июня 2016 в 02:17
21

просто чтобы вы знали, вы можете просто сделать length = property(len) и пропустить однострочную функцию-оболочку и сохранить документацию / самоанализ len с вашей собственностью.