pythonic方式将列表元素与其索引相关联

Dra*_*ric 9 python dictionary list enumerate

我有一个值列表,我想把它们放在一个字典中,将每个值映射到它的索引.

我可以这样做:

>>> t = (5,6,7)
>>> d = dict(zip(t, range(len(t))))
>>> d
{5: 0, 6: 1, 7: 2}
Run Code Online (Sandbox Code Playgroud)

这不错,但我正在寻找更优雅的东西.

我遇到过以下内容,但它与我需要的相反:

>>> d = dict(enumerate(t))
>>> d
{0: 5, 1: 6, 2: 7}
Run Code Online (Sandbox Code Playgroud)

请分享您的解决方案,
谢谢

编辑: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)代表x,y代表枚举(t)])"
1000循环,最佳3:426 usec per环

$ python -mtimeit -s"t = range(int(1e3))""d = dict((y,x)代表x,y代表枚举(t))"
1000循环,最佳3:437每循环usec

$ python -mtimeit -s"t = range(int(1e3))""d = dict(map(反向,枚举(t)))"
100循环,最佳3:3.66毫秒每循环

我尝试对较长的列表和较短的列表(1e2,1e4,1e5)运行相同的测试,并且每个循环的时间与列表的长度成线性比例.

有人可以时间py 2.7+版本吗?

kib*_*ibu 14

您可以使用列表推导(或生成器,具体取决于您的python版本)为您的第二个示例执行简单的就地交换.


使用列表理解:

d = dict([(y,x) for x,y in enumerate(t)])
Run Code Online (Sandbox Code Playgroud)

使用生成器表达式(Python 2.4及更高版本):

d = dict((y,x) for x,y in enumerate(t))
Run Code Online (Sandbox Code Playgroud)

  • 那里你不需要`[]`.`dict`与生成器表达式一起正常工作(保存制作中间列表) (2认同)
  • @JF Sebastian在2004年之前开发的部署系统?Python已经存在了很长一段时间.不难想象必须使用某些Python 2.0应用程序,我的意思是有些人*仍然需要在VB6中工作. (2认同)

Joh*_*ooy 13

在Python2.7 +中你可以像这样写它

>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
Run Code Online (Sandbox Code Playgroud)