list - 将列表元素与其索引相关联的 Pythonic 方式

标签 list dictionary python enumerate

我有一个值列表,我想将它们放入一个字典中,该字典将每个值映射到它的索引。

我可以这样做:

>>> 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/

相关文章:

java - 一次打印一个条目的链表节点 (Java)

C++: map ,键的前一项

python - 如何告诉请求模块不进行 DNS 查找?

python - 将嵌套的字典列表转换为 pandas DataFrame

python - 在列表中查找平均值,并在 Python 中返回结果分数超过平均值

python - Django 数据库和类设计

python - 导入错误 : No module named 'gdbm' occuring while using source ~/. bashrc

list - 在 Python 中运行多个循环

java - 填充后列表为空,但微调器显示它有字符串

arrays - Helm : error converting YAML to JSON: yaml: line xx: did not find expected key