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

9 投票
6 回答
2624 浏览
提问于 2025-04-15 22:41

我有一串值,我想把它们放进一个字典里,让每个值对应它在列表中的位置。

我可以这样做:

>>> 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 个回答

4

这段代码是用来做某些操作的,但具体的功能需要根据上下文来理解。一般来说,代码块里包含了一些指令,这些指令告诉计算机该怎么做。

如果你看到类似的代码,通常可以想象成一系列的步骤,计算机会按照这些步骤来完成任务。每一行代码就像是一个小命令,指引计算机一步一步地执行。

总之,代码块是程序的一部分,帮助实现特定的功能。理解这些代码的关键在于知道它们的作用和如何组合在一起。

>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>
14

在Python2.7及以上版本中,你可以这样写

>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
14

你可以用一种叫做列表推导式的方法(或者根据你使用的Python版本,也可以用生成器)来简单地交换你第二个例子中的两个值。


使用列表推导式:

d = dict([(y,x) for x,y in enumerate(t)])

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

d = dict((y,x) for x,y in enumerate(t))

撰写回答