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


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

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

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


1539
2017-11-11 00:30


起源


您显然要求列表中的元素数量。如果搜索者到这里寻找内存中对象的大小,这是他们正在寻找的实际问题和答案: 如何在Python中确定对象的大小? - Aaron Hall♦


答案:


len() 函数可以与很多类型一起使用 蟒蛇  - 内置类型和库类型。

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

2136
2017-11-11 00:33





如何获得列表的大小?

要查找列表的大小,请使用内置函数, 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__() 方法返回零   在布尔上下文中被认为是假的。

我们也可以看到 __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 items 要么 if not items 更具可读性和更高性能。


138
2017-11-25 21:51





虽然这可能没有用,因为它更具有“开箱即用”功能的意义,但是一个相当简单的黑客就是建立一个带有 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 属性。

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


64
2018-04-19 21:51



只是你知道,你可以做到 length = property(len) 并跳过一行包装函数并保持文档/内省 len 与您的财产。 - Tadhg McDonald-Jensen


除了 len 你也可以用 operator.length_hint (需要python 3.4+)。对于正常 list 两者都是等价但是 length_hint 可以获得list-iterator的长度,这在某些情况下可能很有用:

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


9
2018-04-07 19:03





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

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

print items.__len__()

6
2017-07-14 08:36



在Python中,以下划线开头的名称是语义上非公共方法,不应由用户使用。 - Aaron Hall♦
1。 __foo__:这只是一种约定,是Python系统使用不会与用户名冲突的名称的一种方式。 2。 _foo:这只是一种约定,是程序员指示变量是私有的一种方式(无论在Python中是什么意思)。 3。 __foo:这有实际意义:解释器用这个名字替换 _classname__foo 作为确保名称不会与另一个类中的类似名称重叠的方法。 *没有其他形式的下划线在Python世界中有意义。 *这些约定中的类,变量,全局等没有区别。 - Shai Alon
此问答解释了为什么您不应该直接使用特殊方法作为用户: stackoverflow.com/q/40272161/541136 - Aaron Hall♦
@AaronHall但是对于len功能它几乎是一样的。对于非常大的变量,它可能更快。但是,我明白了,我们应该使用len(obj)而不是obj .__ len __()。 - Shai Alon


并且为了完整性(带有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[:] 是隐式的,因此也是可选的)


-1
2017-12-06 18:14



OP在哪里说他不想使用len()函数? - George J. Adams
@ GeorgeJ.Adams你的创意思维上限在哪里?我的答案回答了OP,尽管不同。我们在StackExchange上重视多种答案,对吧? - Jonathan Komar
同意。但事情是在这种情况下没有理由使用你的代码v。一个班轮。它的计算速度更快?以这种方式编程更容易吗?如果它们显示新的维度,则欢迎多个答案。 - George J. Adams
@ GeorgeJ.Adams我同意。但这也不是拒绝这个答案的理由。我支持我的多元化论点。 - Jonathan Komar
@Jonathan Komar我不同意,如果OP正在寻找创造性的无效方式,他会指定。有些问题可以通过100万种不同的方式回答,但没有人想通过100万个不同的答案阅读 - Brandon Ling