如何在 Python 中获取列表中元素的数量(列表的长度)?

2025-01-08 08:49:00
admin
原创
139
摘要:问题描述:如何获取列表中元素的数量items?items = ["apple", "orange", "banana"] # There are 3 items. 解决方案 1:该len()函数可与 Python 中的多种不同类型一起使用 - 包括...

问题描述:

如何获取列表中元素的数量items

items = ["apple", "orange", "banana"]

# There are 3 items.

解决方案 1:

len()函数可与 Python 中的多种不同类型一起使用 - 包括内置类型和库类型。例如:

>>> len([1, 2, 3])
3

解决方案 2:

如何获取列表的长度?

要查找列表中元素的数量,请使用内置函数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__从数据模型文档中实现的:

object.__len__(self)

调用以实现内置函数len()。应返回对象的长度,即一个 >= 0 的整数。此外,未定义__nonzero__()[在 Python 2 或__bool__()Python 3 中] 方法且其__len__()方法返回零的对象在布尔上下文中被视为 false。

我们还可以看到这__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比其他替代方案更具可读性和性能更高。

解决方案 3:

虽然这可能没有什么用,因为作为“开箱即用”的功能会更有意义,但一个相当简单的技巧是构建一个具有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]

本质上,它与列表对象完全相同,但具有 OOP 友好length属性的额外优势。

与往常一样,您的里程可能会有所不同。

解决方案 4:

此外,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,但它可能会导致自定义类出现问题,因为len(和length_hint)实现了一些安全检查。例如,两者都不允许负长度或超过某个值(值)的长度。因此,使用函数而不是方法sys.maxsize总是更安全!len`__len__`

解决方案 5:

为了完整性(主要是教育性),可以不使用该len()函数。我不认为这是一个好选择,不要在 PYTHON 中像这样编程,但它有助于学习算法。

def count(list):   # list is an iterable object but no type checking here!
    item_count = 0
    for item in list:
        item_count += 1
    return item_count

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

(列表对象必须是可迭代的,如该for..in节所暗示的。)

对于新程序员来说,这里的教训是:如果不在某个时刻计算它们,就无法获得列表中项目的数量。问题是:什么时候是计算它们的好时机?例如,高性能代码(如套接字的 connect 系统调用(用 C 编写))connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);不会计算元素的长度(将该责任交给调用代码)。请注意,地址的长度被传递以节省首先计算长度的步骤?另一种选择:从计算上讲,在传递的对象中添加项目时跟踪项目的数量可能是有意义的。请注意,这会占用更多的内存空间。请参阅Naftuli Kay 的回答。

跟踪长度以提高性能但占用更多内存空间的示例。请注意,我从不使用 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

解决方案 6:

按照前面给出的例子来回答你的问题:

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

print items.__len__()

解决方案 7:

您可以使用该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__)。

解决方案 8:

要获取任何顺序对象中元素的数量,Python 中的 goto 方法 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

解决方案 9:

简单:使用len(list)list.__len__()

这也适用于任何可迭代对象,包括字符串

就实际工作方式而言len(),这是它的实现(在 CPython 中)。

解决方案 10:

有三种方法可以找到列表中元素的长度。我将在这里比较这三种方法的性能分析。

方法 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

性能分析 – Naive vs len()vslength_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

结论

可以明显看出,与其他两种方法相比,naive 所花费的时间非常大,因此len()&length_hint()是最好的选择。

解决方案 11:

Python 中有一个名为 len() 的内置函数可以帮助解决这些情况。

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

对于字符串来说,这会稍有不同:它会计算字符数。

>>> a = "Hello"
>>> len(a)
5
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用