Python:使用索引将列表转换为字典

aha*_*jib 47 python dictionary

我想转换以下列表:

list = ['A','B','C']
Run Code Online (Sandbox Code Playgroud)

对于像这样的字典:

dict = {'A':0, 'B':1, 'C':2}
Run Code Online (Sandbox Code Playgroud)

我试过其他帖子的答案,没有一个对我有用.我现在有以下代码:

{list[i]: i for i in range(len(list))}
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢.谢谢.

Abh*_*jit 75

您可以从内置枚举中获取列表的索引.您只需要反转索引值映射并使用字典理解来创建字典

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

哦,永远不要将变量命名为内置或类型.

  • 使用此解决方案时,请注意原始列表中的重复项将导致单个键具有可用的最高值。 (3认同)

gr1*_*e4r 12

您还可以利用enumerate

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


Soh*_*oqi 10

Pythondict构造函数能够将列表转换tupledict,键作为元组的第一个元素,值作为元组的第二个元素。要做到这一点,你可以使用内置函数 enumerate,其产生tuple(index, value)

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

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


flo*_*rex 9

使用内置函数dict和zip:

>>> lst = ['A','B','C']
>>> dict(zip(lst,range(len(lst))))
Run Code Online (Sandbox Code Playgroud)


YaO*_*OzI 5

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

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

    >>> 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]})
    
    Run Code Online (Sandbox Code Playgroud)