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

Mr_*_*s_D 6 python ordereddictionary python-3.x

在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]]
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

我当然可以list(rows)[:2]按照这里的建议进行操作- 但这是否可以保证按键排序?这是正确的方法吗?

更新:python 2代码会更好:

image = [v for v in rows.values()[:2]]
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ean 3

@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   |      
---------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

然而,两个数字的差异是如此之小,我真的不会在意你使用哪种方法。只需选择最适合您的具体情况的可读性和理解性的方法。