【发布时间】:2011-02-19 08:58:55
【问题描述】:
我有一个值列表,我想将它们放在一个字典中,该字典会将每个值映射到它的索引。
我可以这样做:
>>> t = (5,6,7)
>>> d = dict(zip(t, range(len(t))))
>>> d
{5: 0, 6: 1, 7: 2}
这还不错,但我正在寻找更优雅的东西。
我遇到了以下情况,但这与我需要的相反:
>>> d = dict(enumerate(t))
>>> d
{0: 5, 1: 6, 2: 7}
请分享您的解决方案,
谢谢
编辑:Python 2.6.4
对于包含 1000 个元素的列表,dict(zip) 版本是最快的,生成器和列表理解版本几乎相同,它们慢了约 1.5 倍,而功能映射(反转)则慢得多。
$ python -mtimeit -s"t = range(int(1e3))" "d = dict(zip(t, range(len(t))))"
1000 个循环,最好的 3 个:每个循环 277 微秒
$ python -mtimeit -s"t = range(int(1e3))" "d = dict([(y,x) for x,y in enumerate(t)])"
1000 个循环,最好的 3 个:每个循环 426 微秒
$ python -mtimeit -s"t = range(int(1e3))" "d = dict((y,x) for x,y in enumerate(t))"
1000 个循环,最好的 3 个:每个循环 437 微秒
$ python -mtimeit -s"t = range(int(1e3))" "d = dict(map(reversed, enumerate(t)))"
100 个循环,3 个循环中的最佳:每个循环 3.66 毫秒
我尝试对更长和更短的列表(1e2、1e4、1e5)运行相同的测试,每个循环的时间与列表的长度成线性关系。
有人可以给 py 2.7+ 版本计时吗?
【问题讨论】:
-
我很好奇 - 哪个实现更快?顺便问一下,Chewy,你用的是哪个版本的 Python?
标签: list dictionary python enumerate