2015-12-04 26 views
2

我想在sortedcontainers SortedDict中迭代項目的一部分。我知道我可以做這樣的事情:迭代SortedDict中的項目片段?

from sortedcontainers import SortedDict 

d = SortedDict(b=20, d=30, c=10, e=50, a=40) 

print [k, d[k] for k in in d.islice(1, 4)] 
>> [('b', 20), ('c', 10), ('d', 30)] 

,但我想,以避免所有的個體d[k]查找如果可能的;像d.iteritems()允許切片:

for k, v in d.islice_items(1, 4): 
    print k, v 

有什麼辦法來遍歷在SortedDict項目中分得一杯羹?

回答

3

從v1.4.3開始沒有。基本原理是雙重的:

  1. 查找只是如此friggin fast
  2. 在實現中,SortedDict直接繼承自dict。所以這些值本身存儲在dictSortedDict沒有辦法得到他們比查找本身。

如果我們添加了isliceitems方法,它會和你一樣做。

您可以試試:

lookup = dict.__getitem__ 
print [k, lookup(d, k) for k in in d.islice(1, 4)] 

但我希望這不是更快。

+0

太棒了,謝謝!我沒有嘗試分析上面提到的'itertools.islice'方法。值得做? – mstringer

+0

總是值得剖析。 'SortedDict'和開始索引可能不得不相當大,因爲它很重要(在幾十或幾十萬)。 – GrantJ

0

...我想出瞭如何去做。提問前應該檢查itertools:/

import sortedcontainers 
import itertools 

d = sortedcontainers.SortedDict(b=20, d=30, c=10, e=50, a=40) 

print [(k, d[k]) for k in d.islice(1, 4)] 
# outputs: [('b', 20), ('c', 10), ('d', 30)] 

print [i for i in itertools.islice(d.iteritems(), 1, 4)] 
# outputs: [('b', 20), ('c', 10), ('d', 30)] 

itertools.islice的伎倆。

+1

不要這樣做。如果'SortedDict'和起始索引很大,則速度會更慢。 'SortedDict.islice'具有特殊的切片手段。 'itertools.islice'只是循環。有關來源,請參閱https://github.com/grantjenks/sorted_containers/blob/master/sortedcontainers/sortedlist.py#L787。 – GrantJ