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

y2k*_*y2k 1846 python list

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

# FAKE METHOD:
items.amount()  # Should return 3
Run Code Online (Sandbox Code Playgroud)

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

gnu*_*nud 2550

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

>>> len([1,2,3])
3
Run Code Online (Sandbox Code Playgroud)

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


Aar*_*all 222

如何获得列表的大小?

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

items = []
items.append("apple")
items.append("orange")
items.append("banana")
Run Code Online (Sandbox Code Playgroud)

现在:

len(items)
Run Code Online (Sandbox Code Playgroud)

返回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中被视为false.

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

items.__len__()
Run Code Online (Sandbox Code Playgroud)

返回3.

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

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

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            xrange, dict, set, frozenset))
True
Run Code Online (Sandbox Code Playgroud)

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

当然,要测试特定长度,只需测试相等性:

if len(items) == required_length:
    ...
Run Code Online (Sandbox Code Playgroud)

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

另外,不要这样做:

if len(items): 
    ...
Run Code Online (Sandbox Code Playgroud)

相反,只需:

if items:     # Then we have some items, not empty!
    ...
Run Code Online (Sandbox Code Playgroud)

要么

if not items: # Then we have an empty list!
    ...
Run Code Online (Sandbox Code Playgroud)

在这里解释原因,但简而言之,if items或者if not items更具可读性和更高性能.


Naf*_*Kay 74

虽然这可能没什么用处,因为它更具有"开箱即用"功能,但是一个相当简单的黑客就是构建一个带有length属性的类:

class slist(list):
    @property
    def length(self):
        return len(self)
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它:

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

从本质上讲,它与列表对象完全相同,具有OOP友好length属性的额外好处.

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

  • 只是你知道,你可以做`length = property(len)`并跳过一行包装函数并保持`len`的文档/内省与你的属性. (19认同)

MSe*_*ert 17

此外,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
Run Code Online (Sandbox Code Playgroud)

length_hint根据定义只是一个"提示",所以大部分时间len都比较好.

我已经看到几个建议访问的答案__len__.这在处理内置类时很好,list但它可能导致自定义类出现问题,因为len(和length_hint)实现了一些安全检查.例如,两者都不允许负长度或长度超过某个值(该sys.maxsize值).所以使用len函数代替__len__方法总是更安全!


Sha*_*lon 8

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

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

print items.__len__()
Run Code Online (Sandbox Code Playgroud)

  • 在Python中,以下划线开头的名称是语义上非公共方法,不应由用户使用. (15认同)
  • 此问答解释了为什么您不应该直接以用户身份使用特殊方法:http://stackoverflow.com/q/40272161/541136 (4认同)
  • 1.`__foo__`:这只是一种约定,是Python系统使用不会与用户名冲突的名称的一种方式.2.`_foo`:这只是一种约定,是程序员指示变量是私有的一种方式(无论在Python中是什么意思).3.`__foo`:这具有实际意义:解释器将此名称替换为`_classname__foo`,以确保该名称不会与另一个类中的类似名称重叠.*没有其他形式的下划线在Python世界中有意义.*这些约定中的类,变量,全局等没有区别. (2认同)

Jon*_*mar 6

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

def count(list):
    item_count = 0
    for item in list[:]:
        item_count += 1
    return item_count

count([1,2,3,4,5])
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我们陷入“不要这样做,但它很有趣”的兔子洞,我提供 `length = max(enumerate(list))[0] + 1`。 (3认同)
  • 为什么“for item in list[:]:”?为什么不是“对于列表中的项目:”?另外,我会使用 `+= 1` 来递增。 (2认同)
  • @KirkStrauser 哈哈,我嘲笑了“len()”上这种巧妙的回避 (2认同)

Ala*_*gel 6

您可以使用该len()函数来查找 python 中可迭代对象的长度。

my_list = [1, 2, 3, 4, 5]
print(len(my_list))  # OUTPUT: 5
Run Code Online (Sandbox Code Playgroud)

len()函数也适用于字符串:

my_string = "hello"
print(len(my_string))  # OUTPUT: 5
Run Code Online (Sandbox Code Playgroud)

总而言之,len()适用于任何序列或集合(或定义的任何大小的对象__len__)。


Cry*_*ore 5

python 中有一个名为 len() 的内置函数,它可以在这些情况下提供帮助。

>>> a = [1,2,3,4,5,6]
>>> len(a)  # Here the len() function counts the number of items in the list.
6
Run Code Online (Sandbox Code Playgroud)

对于字符串来说,这会略有不同:它计算字符数。

>>> a = "Hello"
>>> len(a)
5
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以通过三种方式查找列表中元素的长度。我将在这里对这 3 种方法进行性能分析比较。

\n

方法一:使用len()

\n
items = []\nitems.append("apple")\nitems.append("orange")\nitems.append("banana")\n\nprint(len(items))\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
3\n
Run Code Online (Sandbox Code Playgroud)\n

方法2:使用朴素计数器方法

\n
items = []\nitems.append("apple")\nitems.append("orange")\nitems.append("banana")\n\ncounter = 0\nfor i in items:\n    counter = counter + 1\n\nprint(counter)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
3\n
Run Code Online (Sandbox Code Playgroud)\n

方法三:使用length_hint()

\n
items = []\nitems.append("apple")\nitems.append("orange")\nitems.append("banana")\n\nfrom operator import length_hint\nlist_len_hint = length_hint(items)\nprint(list_len_hint)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
3\n
Run Code Online (Sandbox Code Playgroud)\n

性能分析 \xe2\x80\x93 Naive vs len()vslength_hint()

\n

笔记:为了进行比较,我将输入列表更改为一个大集合,这样可以提供大量的时间差来比较方法。

\n
items = list(range(100000000))\n\n# Performance Analysis\nfrom operator import length_hint\nimport time\n\n# Finding length of list\n# using loop\n# Initializing counter\n\nstart_time_naive = time.time()\ncounter = 0\nfor i in items:\n    # incrementing counter\n    counter = counter + 1\nend_time_naive = str(time.time() - start_time_naive)\n\n# Finding length of list\n# using len()\nstart_time_len = time.time()\nlist_len = len(items)\nend_time_len = str(time.time() - start_time_len)\n\n# Finding length of list\n# using length_hint()\nstart_time_hint = time.time()\nlist_len_hint = length_hint(items)\nend_time_hint = str(time.time() - start_time_hint)\n\n# Printing Times of each\nprint("Time taken using naive method is : " + end_time_naive)\nprint("Time taken using len() is : " + end_time_len)\nprint("Time taken using length_hint() is : " + end_time_hint)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Time taken using naive method is : 7.536813735961914\nTime taken using len() is : 0.0\nTime taken using length_hint() is : 0.0\n
Run Code Online (Sandbox Code Playgroud)\n

结论

\n

可以清楚地看到,与其他两种方法相比,naive 所花费的时间非常长,因此len()&length_hint()是使用的最佳选择。

\n

  • 这是*糟糕的*微基准测试代码。使用“time.time()”计时的单次执行?学习使用 `timeit` 模块;有太多令人困惑的变量,除了“当然循环和计数速度较慢”之外,不可能从测试中得出任何结论。 (2认同)