如何获取列表 items 中的元素数?
items = ["apple", "orange", "banana"]
# There are 3 items.
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
len() 函数可用于 Python 中的多种不同类型 - 内置类型和库类型。例如:
>>> len([1, 2, 3])
3
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
如何获取列表的大小?
要查找列表的大小,请使用内置函数 len:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
现在:
len(items)
返回 3。
解释
Python 中的一切都是对象,包括列表。所有对象在 C 实现中都有某种标题。
Python 中具有“大小”的列表和其他类似的内置对象,特别是有一个名为 ob_size 的属性,其中缓存了对象中的元素数量。因此检查列表中的对象数量非常快。
但是,如果您要检查列表大小是否为零,请不要使用 len - 而应使用 put the list in a boolean context - it treated as False if empty, True otherwise。
从文档
len(s)
返回对象的长度(项目数)。参数可以是一个序列(如字符串、字节、元组、列表或范围)或集合(如字典、集合或冻结集)。
len 通过数据模型 docs 中的 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,
range, 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!
...
我explain why here 但简而言之,if items 或 if not items 都更具可读性和性能。
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
虽然这可能没有用,因为它作为“开箱即用”的功能更有意义,但一个相当简单的技巧是构建一个具有 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 属性的额外好处。
与往常一样,您的里程可能会有所不同。
如您所知,您可以只执行 length = property(len) 并跳过单行包装函数,并将 len 的文档/自省与您的属性一起保存。
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
除了 len,您还可以使用 operator.length_hint(需要 Python 3.4+)。对于普通的 list 两者是等价的,但 length_hint 可以获取列表迭代器的长度,这在某些情况下可能很有用:
>>> 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 方法总是更安全!
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
并且为了完整性(主要是教育性的),可以不使用 len() 函数。我不会容忍这是一个很好的选择不要在 PYTHON 中这样编程,但它可以用于学习算法。
def count(list):
item_count = 0
for item in list[:]:
item_count += 1
return item_count
count([1,2,3,4,5])
(list[:] 中带有冒号的索引操作是隐式的,因此也是可选的。)
对于新程序员来说,这里的教训是:你不能在某个时候不计算列表中的项目数。问题变成了:什么时候是计算它们的好时机?例如,高性能代码,如用于套接字的 connect 系统调用(用 C 编写)connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);,不计算元素的长度(将责任交给调用代码)。注意到地址的长度是为了省去先计算长度的步骤而传递的吗?另一种选择:在计算上,在传递的对象中添加项目时跟踪项目的数量可能是有意义的。请注意,这会占用更多内存空间。请参阅Naftuli Kay‘s answer。
跟踪长度以提高性能同时占用更多内存空间的示例。请注意,我从不使用 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
为什么是for item in list[:]:?为什么不for item in list:?另外,我会使用 += 1 来增加。
@GrannyAching 我明确提到了可选的冒号(范围说明符)。出于教育目的,我将范围说明符留在那里 - 知道它是隐含的是有益的。正如您所建议的那样,还推断出列表类型 [] 与我的代码等效。增量运算符也相当于将 1 添加到现有变量,但在所有情况下都更短。因此,如果这是您的推理,我同意应该使用它。无论如何,这段代码不应该在任何地方投入生产(学习编程时除外)。
如果我们要陷入“不要这样做,但它很有趣”的兔子洞,我会提供 length = max(enumerate(list))[0] + 1。
@KirkStrauser 哈哈,我在 len() 上对这种巧妙的回避笑了
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
以前面给出的示例回答您的问题:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
print items.__len__()
在 Python 中,以下划线开头的名称在语义上是非公共方法,用户不应使用。
1. __foo__:这只是一个约定,是 Python 系统使用不会与用户名冲突的名称的一种方式。 2. _foo:这只是一个约定,是程序员指示变量是私有的(无论在 Python 中是什么意思)的一种方式。 3. __foo:这有实际意义:解释器用_classname__foo替换这个名字,以确保这个名字不会与另一个类中的相似名字重叠。 * 在 Python 世界中没有其他形式的下划线有意义。 * 在这些约定中,类、变量、全局等没有区别。
此问答解释了为什么您不应直接以用户身份使用特殊方法:stackoverflow.com/q/40272161/541136
@AaronHall 但对于 len 功能几乎相同。对于非常大的变量,它可能会更快。但是,我明白你的意思,我们应该使用 len(obj) 而不是 obj.__len__()。
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
您可以使用 len() 函数在 python 中查找可迭代的长度。
my_list = [1, 2, 3, 4, 5]
print(len(my_list)) # OUTPUT: 5
len() 函数也适用于字符串:
my_string = "hello"
print(len(my_string)) # OUTPUT: 5
总而言之,len() 适用于任何序列或集合(或定义 len 的任何大小的对象)。
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
在 python 中有一个名为 len() 的内置函数将在这些情况下有所帮助。
a=[1,2,3,4,5,6]
print(len(a)) #Here the len() function counts the number of items in the list.
输出:
>>> 6
这在字符串的情况下会略有不同(如下):
a="Hello"
print(len(a)) #Here the len() function counts the alphabets or characters in the list.
输出:
>>> 5
这是因为变量 (a) 是一个字符串而不是一个列表,所以它会计算字符串中的字符或字母的数量,然后打印输出。
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
要获取任何顺序对象中的元素数量,您在 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
"any iterable" -- 这是不正确的。我认为您的意思是“任何序列”。生成器,例如:len(x for x in range(8)) -> TypeError: object of type 'generator' has no len()。
迭代器和可迭代之间存在细微差别。所有迭代器都是可迭代的,但不是。更多解释请参考这篇文章geeksforgeeks.org/python-difference-iterable-iterator/amp
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
您可以通过三种方式找到列表中元素的长度。我将在此处将这 3 种方法与性能分析进行比较。
方法一:使用 len()
items = []
items.append("apple")
items.append("orange")
items.append("banana")
print(len(items))
输出:
3
方法2:使用朴素计数器方法
items = []
items.append("apple")
items.append("orange")
items.append("banana")
counter = 0
for i in items:
counter = counter + 1
print(counter)
输出:
3
方法 3:使用 length_hint()
items = []
items.append("apple")
items.append("orange")
items.append("banana")
from operator import length_hint
list_len_hint = length_hint(items)
print(list_len_hint)
输出:
3
性能分析——Naive vs len() vs length_hint()
注意:为了比较,我将输入列表更改为一个大集合,可以提供大量时间差来比较方法。
items = list(range(100000000))
# Performance Analysis
from operator import length_hint
import time
# Finding length of list
# using loop
# Initializing counter
start_time_naive = time.time()
counter = 0
for i in items:
# incrementing counter
counter = counter + 1
end_time_naive = str(time.time() - start_time_naive)
# Finding length of list
# using len()
start_time_len = time.time()
list_len = len(items)
end_time_len = str(time.time() - start_time_len)
# Finding length of list
# using length_hint()
start_time_hint = time.time()
list_len_hint = length_hint(items)
end_time_hint = str(time.time() - start_time_hint)
# Printing Times of each
print("Time taken using naive method is : " + end_time_naive)
print("Time taken using len() is : " + end_time_len)
print("Time taken using length_hint() is : " + end_time_hint)
输出:
Time taken using naive method is : 7.536813735961914
Time taken using len() is : 0.0
Time taken using length_hint() is : 0.0
结论
可以清楚地看出,naive 所花费的时间与其他两种方法相比非常大,因此 len() & length_hint() 是使用的最佳选择。
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
就 len() 的实际工作方式而言,这是 its C implementation:
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_ssize_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 有两种用于存储整数的类型)并返回。
为什么了解或了解 C 实现很重要?
由于此问题并非特定于 CPython,因此此答案可能具有误导性。 PyPy,IronPython,...可以并且确实以不同的方式实现它。
这不是一个有用的答案,因为它只是说“len 调用 PyObject_Size()”并没有说明它的作用,即“PyObject_Size() calls 传递的 sq_length 或 PyMapping_Size在对象中。”
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer