具有枚举内置函数的嵌套列表理解

Nested list comprehension with enumerate build-in function

我正在学习列表理解,但我卡在了以下代码中:

[[c for c in enumerate(r)] for r in enumerate(['a','b','c'])]

哪个returns:

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

然而,我期待的是:

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

我看了一些文章,但无法理解提示输出。请有人给我解释一下。

您正在枚举外部 enumerate():

的每个单独元素
  • 您在列表 ['a', 'b', 'c'] 上创建一个 enumerate(),这将生成一个包含 (counter, letter).

  • 的元组序列
  • 然后将 enumerate() 应用于每个 (counter, letter) 元组,生成 (0, count)(1, letter) 元组 each.

所以最后你得到列表中每个字母的以下元素 ['a', 'b', 'c']:

[
    [(0, 0), (1, 'a')],  # enumerate((0, 'a'))
    [(0, 1), (1, 'b')],  # enumerate((1, 'b'))
    [(0, 2), (1, 'c')],  # enumerate((2, 'c'))
]

如果你想获得 (counter, (counter, element)),你需要将 enumerate() 应用到 enumerate() 整个输出 ,而不是每个人元组:

>>> [combo for combo in enumerate(enumerate(['a','b','c']))]
[(0, (0, 'a')), (1, (1, 'b')), (2, (2, 'c'))]

您也可以在 enumerate() 上调用 list()

>>> list(enumerate(enumerate(['a','b','c'])))
[(0, (0, 'a')), (1, (1, 'b')), (2, (2, 'c'))]