python 中的 OrderedDict 3 - 如何按顺序获取键?
OrderedDict in python 3 - how to get the keys in order?
在 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]
here - 但这能保证让我按顺序拿到钥匙吗?这是正确的方法吗?
更新: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 |
---------------------------------------------------------------
不过,这两个数字相差很小,我真的不会对你使用哪种方法有太大的区别。只需为您的具体情况选择最易读和最易理解的方法。
在 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]
here - 但这能保证让我按顺序拿到钥匙吗?这是正确的方法吗?
更新: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 |
---------------------------------------------------------------
不过,这两个数字相差很小,我真的不会对你使用哪种方法有太大的区别。只需为您的具体情况选择最易读和最易理解的方法。