如何用Python获得列表中的元素数量?

考虑:

1
2
3
4
5
6
7
items = []
items.append("apple")
items.append("orange")
items.append("banana")

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

我如何得到列表中的元素数量?


len()函数可以与Python中的几种不同类型一起使用——内置类型和库类型。例如:

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

官员2。x文档在这里:len()官方3。x文档在这里:len()


How to get the size of a list?

要查找列表的大小,使用内置函数len:

1
2
3
4
items = []
items.append("apple")
items.append("orange")
items.append("banana")

现在:

1
len(items)

返回3。

解释

Python中的所有东西都是对象,包括列表。所有对象在C实现中都有某种头文件。

在Python中,list和其他类似的具有"size"的内置对象有一个名为ob_size的属性,其中缓存了对象中的元素数量。所以检查列表中的对象数量是非常快的。

但是,如果要检查列表大小是否为零,不要使用len——而是将列表放在布尔上下文中——如果为空,则将其视为False,否则为True。

从文档

len(s)

Return the length (the number of items) of an object. The argument may be a sequence (such as a string, bytes, tuple, list, or range) or
a collection (such as a dictionary, set, or frozen set).

len__len__实现,数据模型文档:

object.__len__(self)

Called to implement the built-in function len(). Should return the length of the object, an integer >= 0. Also, an object that doesn’t
define a __nonzero__() [in Python 2 or __bool__() in Python 3] method and whose __len__() method returns zero
is considered to be false in a Boolean context.

我们还可以看到__len__是一种列表的方法:

1
items.__len__()

返回3。

内置类型可以得到的len(长度)

事实上,我们可以得到所有描述类型的信息:

1
2
3
>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list,
                                            xrange, dict, set, frozenset))
True

不要使用len测试空列表或非空列表

当然,要测试特定的长度,只需测试等式:

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

但是有一个特殊的情况是测试零长度列表或者相反的列表。在这种情况下,不要测试是否相等。

还有,不要这样做:

1
2
if len(items):
    ...

相反,简单地做:

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

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

我在这里简单解释一下为什么if itemsif not items可读性更好,性能更好。


虽然这可能没有什么用,因为它作为一个"开箱即用"的功能会更有意义,一个相当简单的技巧是构建一个带有length属性的类:

1
2
3
4
class slist(list):
    @property
    def length(self):
        return len(self)

你可以这样用:

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

本质上,它与list对象完全相同,具有一个对操作友好的length属性。

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


除了len,您还可以使用operator.length_hint(需要Python 3.4+)。对于一个普通的list,两者是等价的,但是length_hint可以得到列表迭代器的长度,这在某些情况下是有用的:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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__方法更安全!


根据前面给出的例子回答你的问题:

1
2
3
4
5
6
items = []
items.append("apple")
items.append("orange")
items.append("banana")

print items.__len__()


为了完整起见,可以不使用len()函数(我不认为这是一个好的选择):

1
2
3
4
5
6
7
def count(list):
  item_count = 0
  for item in list[:]:
    item_count = item_count + 1
  return item_count

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

(list[:]中的冒号是隐式的,因此也是可选的。)