使用enumerate()交换索引和值?

6

Python的enumerate()返回索引和值的元组:

enumerate('abc')
((0,'a'),(1,'b'),(2,'c'))

我希望能按照item,index的顺序(('a',0))获取这些元组。

我应该怎样做呢?

我想使用反向元组创建字典,例如:

{'a':0,'b':1,'c':2}

5
简述:{v: k for k,v in enumerate('abc')} 表示用字母 'abc' 的索引作为值,以字母本身作为键,生成一个字典。 - Nir Alfasi
6个回答

10

使用 dict 推导式将其反转:

result = {v: i for i, v in enumerate('abc')}

回应@karakfa的观点 - 这将覆盖可能重复的元素。如果你的字符串是abca,则分配给a的索引值将包含3,而不是0


你可以将其更改为反转元组的列表推导式,以便将其传递给 multidict.MultiDict(请注意,我没有使用该软件包,但如果存在问题,我敢打赌还有无数其他选项)。 - Daniel H

7
一种解决方法是使用 itertools 库:
import itertools
dict(zip('abc', itertools.count()))

itertools.count() 是一个生成器对象,它生成 0、1、2...等数字,zip 函数则将这两个对象合并在一起。


1
这很好,我喜欢它! - J. Anderson

6

另一种方法是使用压缩(zip):

>>> s = 'abc'
>>> dict(zip(s, range(len(s))))
{'a': 0, 'b': 1, 'c': 2}

1

总是有好的、老式的匿名函数来为您完成工作。虽然不是最干净的解决方案,但可以完成任务。

dict(map(lambda x: (x[1], x[0]), enumerate('abc')))

1
使用生成器:
>>> dict((v, i) for i, v in enumerate('abc'))
{'a': 0, 'b': 1, 'c': 2}

1

你也可以尝试使用列表推导式:

new_data=((0,'a'),(1,'b'),(2,'c'))

print(tuple([(i[1],i[0])for i in new_data]))

输出:

(('a', 0), ('b', 1), ('c', 2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接