当前位置: 首页 > 面试题库 >

了解嵌套列表理解

焦博实
2023-03-14
问题内容

我想了解嵌套列表的理解。下面,我列出了一个列表理解表达式及其for循环等效项。
我不知道我的理解是否正确。

例如,

[(min([row[i] for row in rows]),max([row[i] for row in rows])) 
for i in range(len(rows[0]))]

相当于

result=[]
for i in range(len(rows[0])):
  innerResult=[]
  for row in rows:
    innerResult.append(row[i])
  innerResult2=[]
  for row in rows:
    innerResult2.append(row[i])
  tuple=(min(innerResult), max(innerResult2))
  result.append(tuple)

如果可以概括一下,我猜

[exp2([exp1 for x in xSet]) for y in ySet]

表格可以翻译为以下内容。(我希望我是对的)

result=[]
for y in ySet:
  innerResult =[]
  for x in xSet:
    innerResult.append(exp1)
  exp2Result = exp2(innerResult)
  result.append(exp2Result)

对于更简单的情况,

[exp1 for x in xSet for y in ySet]

等于

result=[] 
for x in xSet:
  for y in ySet: 
    result.append(exp1)

而,

[[exp1 for x in xSet] for y in ySet]

等于

result=[]
for y in ySet:
  innerResult=[]
  for x in xSet:
    innerResult.append(exp1)
  result.append(innerResult)

我问了一个类似的问题,即用于复杂列表理解
的循环表达式的等效项。那里给出的答案是在理解了表单内部的内容之后重构了表单。
我想知道它是如何系统地工作的,因此我可以将该概念应用于其他稍有不同的示例。


问题答案:

简短的答案是: 是的,您的理解正确

有一个陷阱:在python代码中通常使用嵌套列表理解的方法是对多维数组进行操作。

一个典型的例子是当您对矩阵进行运算时:

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [[el - 1 for el in row] for row in matrix]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

如您所见,“嵌套”通过在矩阵的每个维度上进行操作而起作用。

在您提供的示例中,ySet[不幸的名字btw,因为
集合
是python提供的类型之一]只是一个通用计数器,这使得了解幕后情况变得有些困难。

至于第一个示例:

>>> rows = ([1, 2, 3], [10, 20, 30])
>>> [(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))]
[(1, 10), (2, 20), (3, 30)]

您可能希望研究zip内置功能:

>>> zip(rows[0], rows[1])
[(1, 10), (2, 20), (3, 30)]

或为了最大程度地简洁和优雅:

>>> zip(*rows)
[(1, 10), (2, 20), (3, 30)]

HTH!



 类似资料:
  • 问题内容: 我试图在一个内部列表中使用外部列表理解的值: 但是不幸的是,这会引发NameError,因为名称是未知的(尽管外部列表理解指定了该名称)。 这是Python的局限性(尝试过2.7.3和3.2.3)还是有充分的理由解释为什么它不起作用? 是否有计划摆脱限制? 是否有解决方法(可能我没有弄清楚一些不同的语法)来实现我想要的? 问题答案: 您在谈论列表 推导 ,而不是生成器表达式。 您需要交

  • 问题内容: 解释我的问题的最好方法是举一个例子: example.py: 当我在python 2下运行它时,它工作正常,但是在python 3下,我得到了for类(但不是class ): 为什么只有class会引发a ,为什么只在Python 3下? 问题答案: 类作用域在Python 3中有点奇怪,但这是有充分理由的。 在Python 2中,迭代变量(以及您的示例中)从列表理解中泄漏出来,并将包

  • 问题内容: 我有这个嵌套列表: 现在,我要做的是将列表中的每个元素转换为float。我的解决方案是这样的: 但这可以使用嵌套列表理解来完成吗? 我所做的是: 但是结果是一堆100的总数为2400。 任何解决方案,解释将不胜感激。谢谢! 问题答案: 这是使用嵌套列表理解的方法: 这将为你提供一个列表列表,与你开始时的列表类似,只是使用浮点数而不是字符串。如果你想要一个固定列表,则可以使用。

  • 问题内容: 我了解简单列表理解的工作原理,例如: 而且我也了解嵌套列表的综合工作原理: 所以,当我尝试这样做 我期望这样: 但是我得到了: 所以我有更好的方法解决问题,这给了我我想要的 但是我不明白在第一个代码中返回9个元素 问题答案: 它有9个数字的原因是因为python对待 类似于 即,它是一个嵌套循环

  • 问题内容: 我对此毫无疑问: 我以为是全部,但是后来我发现了以下片段: 这使。问题是我很难理解中的语法,有人可以解释它的工作原理吗? 问题答案: 难以理解的“嵌套”理解。循环以与理解相同的顺序展开。 这样有助于你进行思考。

  • 假设我期望一个列表列表,其中内部列表具有不同的类型和长度,例如。G 如何使用argparse解析上述列表? 关于stackoverflow最有用的问题: 类似的问题也存在,最有用的问题在这里。但是在我的例子中,它们还不够好,因为它们忽略了列表嵌套了不同的数据类型和长度的事实。