如何获取列表项中的元素数?
items = ["apple", "orange", "banana"]
# There are 3 items.
如何获取列表项中的元素数?
items = ["apple", "orange", "banana"]
# There are 3 items.
当前回答
为了完整性(主要是教育性的),可以不使用len()函数。我不会容忍这是一个很好的选择,不要在巨蟒身上这样编程,但它有助于学习算法。
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..暗示。)
对于新程序员来说,这里的教训是:如果不在某个时间点对项目进行计数,就无法获得列表中的项目数。问题变成了:什么时候是计算它们的好时机?例如,高性能代码,如套接字的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
其他回答
要获取任何顺序对象中的元素数,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
为了完整性(主要是教育性的),可以不使用len()函数。我不会容忍这是一个很好的选择,不要在巨蟒身上这样编程,但它有助于学习算法。
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..暗示。)
对于新程序员来说,这里的教训是:如果不在某个时间点对项目进行计数,就无法获得列表中的项目数。问题变成了:什么时候是计算它们的好时机?例如,高性能代码,如套接字的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
简单:使用len(list)或list__len__()
就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_size_t是对象可以具有的最大长度。PyObject_Size()是一个返回对象大小的函数。如果无法确定对象的大小,则返回-1。在这种情况下,将执行以下代码块:
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
结果引发了异常。否则,将执行此代码块:
return PyLong_FromSsize_t(res);
res是一个C整数,它被转换为Python int(在C代码中仍然称为“Long”,因为Python 2有两种类型用于存储整数)并返回。
虽然这可能不太有用,因为它作为“开箱即用”功能更有意义,但一个相当简单的方法是构建一个具有长度属性的类:
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友好长度属性的额外好处。
一如既往,您的里程数可能会有所不同。
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