目录
1. deque是python的collections中的一个类
2.2 创建deque时,并指定大小maxlen,即能装几个元素, 以及deque添加元素append()方法
1. deque是python的collections中的一个类
deque的对象像是一个列表,只不过可以固定这个deque对象的大小,以及列表是在队列的两端执行添加和弹出元素的操作,可以理解为,deque是一个双向的队列,
尽管你也可以手动在一个列表上实现这一的操作(比如增加、删除等等)。但是这里的队列方案会更加优雅并且运行得更快些。
以下是部分源码,以及部分方法:
class deque(object): """ deque([iterable[, maxlen]]) --> deque object A list-like sequence optimized for data accesses near its endpoints. """ def append(self, *args, **kwargs): # real signature unknown """ Add an element to the right side of the deque. """ pass def appendleft(self, *args, **kwargs): # real signature unknown """ Add an element to the left side of the deque. """ pass def clear(self, *args, **kwargs): # real signature unknown """ Remove all elements from the deque. """ pass def copy(self, *args, **kwargs): # real signature unknown """ Return a shallow copy of a deque. """ pass def count(self, value): # real signature unknown; restored from __doc__ """ D.count(value) -> integer -- return number of occurrences of value """ return 0 def extend(self, *args, **kwargs): # real signature unknown """ Extend the right side of the deque with elements from the iterable """ pass def extendleft(self, *args, **kwargs): # real signature unknown """ Extend the left side of the deque with elements from the iterable """ pass def index(self, value, start=None, stop=None): # real signature unknown; restored from __doc__ """ D.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. """ return 0 def insert(self, index, p_object): # real signature unknown; restored from __doc__ """ D.insert(index, object) -- insert object before index """ pass def pop(self, *args, **kwargs): # real signature unknown """ Remove and return the rightmost element. """ pass def popleft(self, *args, **kwargs): # real signature unknown """ Remove and return the leftmost element. """ pass def remove(self, value): # real signature unknown; restored from __doc__ """ D.remove(value) -- remove first occurrence of value. """ pass def reverse(self): # real signature unknown; restored from __doc__ """ D.reverse() -- reverse *IN PLACE* """ pass def rotate(self, *args, **kwargs): # real signature unknown """ Rotate the deque n steps to the right (default n=1). If n is negative, rotates left. """ pass2.deque的简单使用以及它的方法
2.1 创建deque的方法
可以创建一个空的deque,也可以创建带数据的deque,这个数据,我们通过源码看,必须是一个可迭代的对象接口,列表,元组等等。
from collections import deque # 创建一个空的deque data = deque() print(data) print("=" * 60) # 创建有数据的deque data1 = deque('abcd') print(data1) print("=" * 60) # 创建有数据的deque data2 = deque([1, 2, 3, 4]) print(data2) print("=" * 60)
2.2 创建deque时,并指定大小maxlen,即能装几个元素, 以及deque添加元素append()方法
from collections import deque # 创建一个空的deque, 并指定最大的元素是3个 data = deque(maxlen=3) data.append(1) data.append(2) data.append(3) print(data) data.append(4) print(data)运行结果,我们可以看到,当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉
2.3 deque的 appendleft()方法
从deque队列的左侧添加数据,append()就是默认就尾部即右侧添加数据
from collections import deque data = deque('123') print(data) print("=" * 60) data.appendleft(0) print(data)运行结果
deque(['1', '2', '3']) ============================================================ deque([0, '1', '2', '3'])2.4 deque的 clear()方法
清空deque队列,让其变成空队列
from collections import deque data = deque('123') print(data) print("=" * 60) data.clear() print(data)运行结果
deque(['1', '2', '3']) ============================================================ deque([])2.5 deque的 copy()方法
deque的copy方法相当于深拷贝,拷贝后的地址不相同,并且原来的值修改后,不会影响拷贝后的值。
from collections import deque data1 = deque('123') print(data1) print("=" * 60) data2 = data1.copy() print(data2) print("地址比较") print("data1的地址", id(data1)) print("data2的地址", id(data2)) print("修改数据后,看变化") data1.append('4') print(data1) print("=" * 60) print(data2)运行结果:
deque(['1', '2', '3']) ============================================================ deque(['1', '2', '3']) 地址比较 data1的地址 2404465361192 data2的地址 2404465361304 修改数据后,看变化 deque(['1', '2', '3', '4']) ============================================================ deque(['1', '2', '3'])2.6 deque的count方法
count(value),获取deque队列中某个元素的个数
from collections import deque data1 = deque('123333333') print(data1) print("=" * 60) count = data1.count('3') print(count)运行结果:
deque(['1', '2', '3', '3', '3', '3', '3', '3', '3']) ============================================================ 72.7 deque中的extend()方法
两个队列合并,extend(value), value的值可以是deque对象也可以是可迭代的对象,字符串,列表,元组等等
from collections import deque data1 = deque('123') data2 = deque('456') data1.extend(data2) print(data1)运行结果
deque(['1', '2', '3', '4', '5', '6'])2.8 deque中的extendleft()方法
两个队列合并,从左侧合并,extendleft(value), value的值可以是deque对象也可以是可迭代的对象,字符串,列表,元组等等
要注意。合并时候,value的值,也是反着来的,注意看下面的打印,从左侧开始往里面加
from collections import deque data1 = deque('123') data1.extendleft('456') print(data1)运行结果:
deque(['6', '5', '4', '1', '2', '3'])2.9 deque中的index方法
index(value,start=None,end=None), 怎么使用请看代码
from collections import deque data1 = deque('helloword') print(data1.index('o')) # 有多个的话,取第一个的索引位置 print(data1.index('o', 5)) # 从第五个开始(索引从0开始) print(data1.index('o', 5, 8)) # 从第五个开始 -- 第八个结束运行结果:
4 6 62.10 deque中的insert方法
insert(index,value), 在index位置上,插入value值, 注意顺序
from collections import deque data1 = deque('helloword') data1.insert(0, '1') # 在第一个位置上插入 1 data1.insert(0, '2') # 在第一个位置上插入 2 data1.insert(0, ['123']) # 在第一个位置上插入 列表123 print(data1)运行结果:
deque([['123'], '2', '1', 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd'])2.11 deque中的pop方法
pop() 方法弹出元素,从尾部弹出,并且返回弹出的这个元素
from collections import deque data1 = deque('12345') print(data1.pop()) # 弹出元素,从右侧即末尾弹出,并返回 print(data1.pop()) # 弹出元素,从右侧即末尾弹出,并返回 print(data1)
2.12 deque中的popleft方法
popleft() 方法弹出元素,从头部弹出,并且返回弹出的这个元素
在队列两端插入或删除元素时间复杂度都是 O(1) ,而在列表的开头插入或删除元 素的时间复杂度为 O(N) 。
from collections import deque data1 = deque('12345') print(data1.popleft()) # 弹出元素,从左侧侧即头部弹出,并返回 print(data1.popleft()) # 弹出元素,从左侧侧即头部弹出,并返回 print(data1)
2.13 deque中的remove方法
remove(value)方法,将deque队列某个元素进行移除
from collections import deque data1 = deque('12345') data1.remove('1') print(data1)2.14 deque中的reverse方法
reverse()方法,将deque队列进行反转
from collections import deque data1 = deque('12345') data1.reverse() print(data1)deque(['5', '4', '3', '2', '1']) Process finished with exit code 02.15 deque中的rotate方法
rotate(n) , 将队列 向右旋转n步(默认n=1)。如果n为负,则向左旋转。
from collections import deque data1 = deque('12345') data1.rotate(3) print(data1) data1.rotate(-3) print(data1)deque(['3', '4', '5', '1', '2']) deque(['1', '2', '3', '4', '5'])
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用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时
作为我的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上找到一个类似的问题
我需要从一个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
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr