<h4>Counter</h4> <p><code>Counter</code>是<code>dict</code>的子类,用于计算一个可迭代对象各元素的个数。其对象的键是出现过的对象,值是其出现的个数。</p> <h5>初始化</h5> <p>使用一个可迭代对象进行初始化:</p> <pre><code>cnt = Counter()#1 cnt = Counter(u"kjhasdfkjbdvkjlbaskjfdasfkjghakcsjvbsdajfhaksjdf")#2 cnt = Counter({'a': 4, 'b': 2})#3 cnt = Counter(a=4, b=2)#4</code></pre>
<p>其中第三个和第四个相同。</p>
<h5>对象方法</h5>
<h6>用类似遍历dict的方式遍历</h6>
<pre><code>#1 for k in cnt: print k, cnt[k] #2 for i in cnt.items(): print i</code></pre>
<h6>用Counter独有方式遍历</h6>
<p>升序排列列出的所有元素。</p>
<pre><code>#1 for e in cnt.elements(): print e</code></pre>
<h6>筛选出现次数最多的n个元素</h6>
<p>其中次数为0或负数的元素会被忽略,没有给出数目则输出所有元素。</p>
<pre><code>print cnt.most_common(3) print cnt.most_common()</code></pre>
<h6>更新对象</h6>
<p>对应项加上给出的可迭代对象中的元素个数。</p>
<pre><code>cnt.update("jjjlvcdl") print cnt</code></pre>
<p>对应项减去给出的可迭代对象中的元素个数。</p>
<pre><code>cnt.subtract("jjjlvcdl") print cnt</code></pre>
<h4>deque</h4>
<p><code>deque</code>是双端队列,不仅可以从队头和队尾进出(且优化了两端的访问),还基本能表现得像一个<code>list</code>(除pop方法有参数差异外)。</p>
<h5>初始化</h5>
<p>使用可迭代对象初始化<code>deque</code>:</p>
<pre><code>dq = deque((1,2,3))</code></pre>
<p>其中<code>deque</code>有个可选的参数<code>maxlen</code>,如果没有指定,则可以创建一个空间可扩展(自动)的双端队列;如果指定了<code>maxlen</code>,则创建一个有限空间的双端队列,当队满时进行元素压入,则会把另一侧最外的元素挤出。</p>
<h5>对象方法</h5>
<h6>append与appendleft</h6>
<p><code>append</code>与普通<code>list</code>的<code>append</code>一样,将元素追加到对象的最右端,而<code>appendleft</code>则相反,将元素追加到对象的最左端。</p>
<pre><code>dq.append(4) dq.appendleft(4)</code></pre>
<h6>pop与popleft</h6>
<p><code>pop</code>从右侧弹出元素,而<code>popleft</code>从左侧弹出元素。
<br />与<code>list</code>的<code>pop</code>不同,<code>deque</code>的<code>pop</code>不能接受参数,仅能从最右边弹出元素。</p>
<pre><code>dq.pop() dq.popleft()</code></pre>
<h6>extend与extendleft</h6>
<p>与<code>list</code>一样,<code>extend</code>将一个可迭代对象中的元素从右侧加入到对象中,而<code>extendleft</code>则从左侧加入,注意压入元素的顺序从参数的可迭代对象第一个元素开始。</p>
<pre><code>dq.extend(xrange(4,10)) dq.extendleft(xrange(4,10))</code></pre>
<h6>遍历</h6>
<p><code>deque</code>可以使用下标访问:</p>
<pre><code>for i in xrange(4,10): print dq[3] del dq[3]</code></pre>
<h6>rotate</h6>
<p>演示使用rotate实现一个跑马灯。</p>
<pre><code>horse = deque(u"====马====") for i in xrange(100): print u"".join(horse) horse.rotate(1)</code></pre>
<h4>namedtuple</h4>
<p>使用指定类名和属性快速创建tuple的一个子类</p>
<h5>初始化</h5>
<p>快速实现一个点类型,此时<code>point</code>是类<code>Point</code>的一个引用:</p>
<pre><code>point = namedtuple("Point", ("x", "y"))</code></pre>
<p><code>point</code>可以使用参数列表和参数赋值的方式初始化:</p>
<pre><code>p = point(5, y=11)</code></pre>
<h5>使用对象的属性</h5>
<h6>像tuple一样使用下标</h6>
<pre><code>print p[0],p[1]</code></pre>
<h6>像对象一样使用</h6>
<pre><code>print p.x,p.y</code></pre>
<h6>对象属性是只读的</h6>
<p>对象是mutable的,不能修改:</p>
<pre><code>try: p.x = 30 except AttributeError: print p.x</code></pre>
<h5>作为原型使用</h5>
<p>通过当前对象作为原型新建对象</p>
<h6>使用字典作为中间转换</h6>
<pre><code>d = p._asdict() d["x"] = 30 a = point(**d) print a</code></pre>
<h6>使用_replace方法</h6>
<pre><code>b = p._replace(x=30) print b</code></pre>
<h5>OrderedDict</h5>
<p><code>OrderedDict</code>是<code>dict</code>的一个子类,不同之处在于<code>OrderedDict</code>的键的顺序是按插入顺序固定的,而<code>dict</code>则是乱序的。</p>
<pre><code>od = OrderedDict(((2,3),(4,5),(0,1))) d = dict(((2,3),(4,5),(0,1))) print od.keys() print d.keys()</code></pre>
<hr />
<blockquote> <p>@<a href="http://mrlyc.blogspot.com/">LYC</a>
<br />转载请注明出处。</p></blockquote>