<p>首先,您应该注意到您需要一个更好的数据结构。Python dict根本没有顺序,<code>OrderedDict</code>只是保持插入顺序(因此每次键更改都需要重新排序)。像<a href="http://stutzbachenterprises.com/blist/sorteddict.html" rel="nofollow">^{<cd2>}</a>这样的已排序字典,甚至像<code>blist.sortedlist</code>这样的排序列表可能更适合您的需要。在</p>
<blockquote>
<p>Is it possible for me to create an iterator class (using the iterator protocol) that will store the dictionary and enable me to loop through them in either forward, or reverse, order? I'm assuming/guessing that I might need to first assign an attribute-value that will indicate whether the next loop should be forward/reverse.</p>
</blockquote>
<p>这里不需要单独的迭代器类。您可以通过内置的<a href="http://docs.python.org/library/functions.html#reversed" rel="nofollow">^{<cd4>}</a>函数获得免费的正向迭代和向后迭代:</p>
<pre><code>for key in mydict:
# do something
for key in reversed(mydict.keys()):
# do something
</code></pre>
<blockquote>
<p>Can I include a generator-function (nested) within my iterator class that will enable me to retrieve the next key; that is, beyond or before a supplied integer-number?</p>
</blockquote>
<p>当然,<code>itertools</code>有很多功能,可以让您做这样的事情:</p>
^{pr2}$
<p>也可以将其打包到函数中:</p>
<pre><code>def first_beyond(pivot, seq):
next(dropwhile(lambda x: x <= pivot, seq))
first_beyond(4, mydict)
first_beyond(20, reversed(mydict.keys()))
</code></pre>
<blockquote>
<p>Similarly, will there be a way for me to supply begin-and-end points and retrieve all keys that fall between these values (in sorted order)?</p>
</blockquote>
<p>您可以轻松地为此构建一个通用工具:</p>
<pre><code>from itertools import dropwhile, takewhile
def between(begin, end, seq):
return takewhile(lambda x: x <= end,
dropwhile(lambda x: x < begin, seq))
</code></pre>
<p>这样使用:</p>
<pre><code>>>> list(between(4, 30, [1,2,4,8,16,32]))
[4, 8, 16]
</code></pre>
<p><strong>编辑:</strong>如果您只是偶尔需要检查已排序的键,您可以将它们转换为已排序的列表并使用它们。习语同上:</p>
<pre><code>keys = sorted(mydict)
# forward and backward iteration
for k in keys:
# ...
for k in reversed(keys):
# ...
# function that returns a forward or backward iterator based on an argument
def forward_or_backward(seq, forward=True):
for x in (iter if forward else reversed)(seq):
yield x
# random access inside a loop
for i, key in enumerate(keys):
# next element
key[i+1]
# the between and first_beyond functions above also work for lists
</code></pre>
<p>你的其他功能可以从这些部分粘在一起。请注意,创建一个特殊的类是不明智的,因为我们可以用一种足够通用的方式编写函数,使它们能够处理<em>任何</em>iterable,而不仅仅是键列表。在</p>