python 3中的OrderedDict - 如何按顺序获取密钥?

时间:2017-05-24 00:25:16

标签: python python-3.x ordereddictionary

在python 2中使用OrderedDict时,我只需使用返回列表的keys方法就可以按插入顺序获取密钥。然而在python 3中:

rows = OrderedDict()
rows[0]=[1,2,3]
rows[1]=[1,2,3]
image = [rows[k] for k in rows.keys()[:2]]

我明白了:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'odict_keys' object is not subscriptable

我当然可以像here那样建议list(rows)[:2] - 但这是否可以保证按顺序获取密钥?这是正确的方式吗?

UPDATE :python 2代码会更好:

image = [v for v in rows.values()[:2]]

当然在python 3上仍会出现同样的错误

1 个答案:

答案 0 :(得分:2)

@mglison是对的。因为OrderedDict遵循迭代器协议,所以保证yield键的顺序正确list()

但是,就像@mglison也提到的那样,itertools.islice()比仅使用list和下标更好,更有效率。在使用timeit模块对这两种方法进行多次计时后,itertools方法的速度大约快了2倍。以下是确切的数字:

在多次获得list(itertools.islice(rows, 2))list(rows.keys())[:2](注意我将islice()的结果投射到列表)的平均时间后,似乎使用后一种方法实际上稍快一点:

---------------------------------------------------------------
|  list(itertools.islice(rows, 2))   |    1.5023668839901838  |      
---------------------------------------------------------------
|  list(rows.keys())[:2]             |    1.495460570215706   |      
---------------------------------------------------------------

然而,这两个数字的差异是如此之小,我真的不会对你使用哪种方法产生太大影响。只需选择最具可读性且易于理解的方法。