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



在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

例如,我当然可以按照这里的建议做list(rows)[:2] - 但这能保证让我得到钥匙吗?这是正确的方法吗?

更新:python 2代码会更好,因为:

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

当然,这在Python 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   |      
---------------------------------------------------------------

但是,这两个数字的差异是如此之小,我真的不会对你使用哪种方法产生太大区别。只需选择最适合您的特定情况的可读性和可理解的方法即可。

最新更新