如何在 Python 中获取列表中元素的数量(列表的长度)?
- 2025-01-08 08:49:00
- admin 原创
- 139
问题描述:
如何获取列表中元素的数量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
扫码咨询,免费领取项目管理大礼包!