我有一个值列表,我想将它们放入一个字典中,该字典将每个值映射到它的索引。
我可以这样做:
>>> 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 usec
$ python -mtimeit -s"t = range(int(1e3))""d = dict([(y,x) for x,y in enumerate(t)])"
1000 次循环,最好的 3 次:每次循环 426 usec
$ python -mtimeit -s"t = range(int(1e3))""d = dict((y,x) for x,y in enumerate(t))"
1000 次循环,最好的 3 次:每次循环 437 usec
$ python -mtimeit -s"t = range(int(1e3))""d = dict(map(reversed, enumerate(t)))"
100 次循环,最好的 3 次循环:每次循环 3.66 毫秒
我尝试对更长和更短的列表(1e2、1e4、1e5)运行相同的测试,并且每个循环的时间与列表的长度成线性比例。
有人可以安排 py 2.7+ 版本吗?
最佳答案
您可以使用列表理解(或生成器,具体取决于您的 Python 版本)为第二个示例执行简单的就地交换。
使用列表理解:
d = dict([(y,x) for x,y in enumerate(t)])
使用生成器表达式(Python 2.4 及更高版本):
d = dict((y,x) for x,y in enumerate(t))
关于list - 将列表元素与其索引相关联的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2831672/