如何将列表转换为以索引作为值的字典?

我试图转换以下列表:

l = ['A', 'B', 'C']

比如:

d = {'A': 0, 'B': 1, 'C': 2}

我已经尝试了其他帖子的答案,但没有一个对我有用:

d = {l[i]: i for i in range(len(l))}

这就给了我一个错误:

unhashable type: 'list'
137197 次浏览

您可以从内置的 enumerate获得列表的索引。你只需要反转索引值映射并使用字典理解来创建一个字典:

>>> lst = ['A', 'B', 'C']
>>> {k: v for v, k in enumerate(lst)}
{'A': 0, 'C': 2, 'B': 1}

You can also take advantage of enumerate:

your_list = ['A', 'B', 'C']
your_dict = {key: i for i, key in enumerate(your_list)}

您必须将 unhash 列表转换为 tuple:

dct = {tuple(key): idx for idx, key in enumerate(lst)}

使用内置函数 dictzip:

>>> lst = ['A', 'B', 'C']
>>> dict(zip(lst, range(len(lst))))

Python dict构造函数能够将 tuple的 list 转换为 dict,key 作为 tuple 的第一个元素,value 作为 tuple 的第二个元素。为了达到这个目的,你可以使用内建函数 enumerate,它产生 (index, value)tuple

然而问题的要求是完全相反的,即 tuple应该是 (value, index)。因此,这需要并且需要在传递给 dict 构造函数之前逆转 tuple 元素的额外步骤。对于这个步骤,我们可以使用内建的 reversed,并使用 map将其应用到列表的每个元素

>>> lst = ['A', 'B', 'C']
>>> dict(map(reversed, enumerate(lst)))
>>> {'A': 0, 'C': 2, 'B': 1}

The easiest solution I used was:

lst = list('ABC')
dict(enumerate(lst))

编辑: 这与作者需要的和我需要的正好相反

  1. 如果是 目标列表中的元素是唯一的,那么字典理解就应该足够优雅,就像 the accepted answer一样。

    >>> lst = ['A', 'B', 'C']
    >>> pos_map = {ele: pos for pos, ele in enumerate(lst)}
    
  2. 但是如果是 目标列表中有重复的元素,那么我们可以使用方便的 ABC1中的 defaultdict模块:

    >>> lst = ['A', 'B', 'C', 'A', 'A', 'B']
    >>> from collections import defaultdict
    >>> pos_map = defaultdict(list)
    >>> for pos, ele in enumerate(lst):
    >>>     pos_map[ele].append(pos)
    >>>
    >>> pos_map
    >>> defaultdict(list, {'A': [0, 3, 4], 'B': [1, 5], 'C': [2]})