pythonic方式将列表元素与其索引关联
我有一串值,我想把它们放进一个字典里,让每个值对应它在列表中的位置。
我可以这样做:
>>> 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倍,而使用函数式的map(reversed)则慢得多。
$ 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)进行相同的测试,发现每次循环的时间与列表的长度成线性关系。
有人能测试一下Python 2.7+的版本吗?
6 个回答
这段代码是用来做某些操作的,但具体的功能需要根据上下文来理解。一般来说,代码块里包含了一些指令,这些指令告诉计算机该怎么做。
如果你看到类似的代码,通常可以想象成一系列的步骤,计算机会按照这些步骤来完成任务。每一行代码就像是一个小命令,指引计算机一步一步地执行。
总之,代码块是程序的一部分,帮助实现特定的功能。理解这些代码的关键在于知道它们的作用和如何组合在一起。
>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>
在Python2.7及以上版本中,你可以这样写
>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
你可以用一种叫做列表推导式的方法(或者根据你使用的Python版本,也可以用生成器)来简单地交换你第二个例子中的两个值。
使用列表推导式:
d = dict([(y,x) for x,y in enumerate(t)])
使用生成器表达式(Python 2.4及以上版本):
d = dict((y,x) for x,y in enumerate(t))