提问



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

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


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

最佳参考


len()函数可以与Python中的许多类型一起使用 - 内置类型和库类型。[50] [51]


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

其它参考1



  

如何获取列表的大小?




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


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


现在:


len(items)


返回3。


说明



Python中的所有内容都是一个对象,包括列表。所有对象在C实现中都有某种标题。


特别是在Python中具有大小的列表和其他类似的内置对象具有称为ob_size的属性,其中对象中的元素的数量被缓存。因此,检查列表中的对象数量非常快。


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


来自文档



len(s) [53]



  返回对象的长度(项数)。参数可以是序列(例如字符串,字节,元组,列表或范围)或
  集合(例如字典,集合或冻结集)。



len__len__实现,来自数据模型docs:[54]


object.__len__(self)



  被称为实现内置函数len()。应该返回对象的长度,一个整数>=0.另外,一个没有的对象
  定义__nonzero__() [[在Python 3中的
>>> len([1,2,3])
3
[[或
items = []
items.append("apple")
items.append("orange")
items.append("banana")
[[]] [[]]并且其__len__()方法返回零
  在布尔上下文中被认为是假的。



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


items.__len__()


返回3。


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



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


>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            xrange, 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 itemsif not items更具可读性和更高性能[[。

其它参考2


虽然这可能没有用,因为它更加有意义是开箱即用的功能,一个相当简单的黑客就是构建一个具有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属性的额外好处。


一如既往,您的里程可能会有所不同

其它参考3


除了len你还可以使用operator.length_hint(需要python 3.4+)。对于正常list,两者都是等价的,但length_hint使得有可能获得列表迭代器的长度,这在某些情况下可能有用:[56] [57]


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

其它参考4


以前给出的例子回答你的问题:


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

print items.__len__()

其它参考5


并且为了完整性(对于带有downvotes的团队拿一个),可以不使用len()函数(我不会宽恕这是一个好的选择):


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[:]中的冒号是隐式的,因此也是可选的)