【问题标题】:How to use counter variable inside List Comprehension?如何在列表理解中使用计数器变量?
【发布时间】:2021-10-05 10:04:09
【问题描述】:

这个问题是关于列表理解的。但是,可迭代对象有点复杂,所以我对如何编写这个 List Comprehension 感到困惑。

所以,我有一些像这样的 pydantic 类

class textbox(BaseModel):
    x1: int
    y1: int
    x2: int
    y2: int
    
class Page(BaseModel):
    color: List[RGB]
    textboxes: List[textbox]
    
class Notepad(BaseModel):
    pages: List[Page]

假设所有这些都分配了适当的值。我想做一个这样的列表理解,这样我就可以分别访问每个页面,并且每个页面都可以访问每个文本框并将它们放在一个列表中。

TotalTextBox = [textbox in textboxes for Notepad.pages[i].textboxes] 

但我遇到了一个问题,因为列表理解不允许我使用计数器变量 i。谁能帮我解决这个问题?谢谢。

附:我不想使用枚举。我想要一个简单的列表作为结果。

【问题讨论】:

  • @Haroldo_OK:你的意思是enumerate()
  • [tb for page in notepad.pages for tb in page.textboxes]…?
  • 枚举对象可以用在列表推导中,事实上,在大多数地方你会使用列表;没有问题。
  • 是的,虽然enumerate() 返回一个对象,但它被设计为迭代。这个网站上有很多examples
  • 如果您可以提供并使用示例数据更新您的问题以帮助用户重现您的问题,这将很有帮助。

标签: python list-comprehension


【解决方案1】:

您希望在 Python 中使用 enumerate 函数。

我建议从简单开始,并使用多个 for 循环,因为您知道如何实现这一点。

然后慢慢将其移入一个综合列表。将您的问题分解为多个阶段并将其转换为您想要的答案通常更容易。

enumerate 如何与列表理解配合使用以将其应用于您的问题的示例。

a_list = ["a", "b", "c"]
enumerate_list = [(index, element) for index, element in enumerate(a_list)]

打印列表如下所示:

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

根据 Haroldo 的建议,为了证明这确实提供了列表的最终结果,如果您打印这样的类型:

print(type(enumerate_list))

输出会是这样的:

<class 'list'>

这可以根据您的需要进行修改,只需应用您的列表知识并慢慢进行。

【讨论】:

  • 根据问题:“我不想想使用枚举。”
  • 当我发布这个答案时,这个问题似乎被编辑了。
  • 据我所知,他们不想使用enumerate() 的原因是因为他们不明白它的工作原理和原因。但是工作,它会:最终结果将是一个列表;中间类型无关紧要。也许您可以添加一个额外的行,打印enumerate_list 的类型,表明它实际上是一个列表;这对我来说很清楚,但对其他人来说可能不是。
  • 我进行了这项更改,希望能将他们指向正确的方向。因为它肯定会为他们提供他们所追求的东西。
  • 我忘了更清楚地解释语法细节:enumerate(a_list) 确实返回一个枚举对象,但它周围的表达式 [(index, element) for index, element in some_enumerated_object] 返回一个列表。事实上,如果你想让整个理解返回一个枚举对象而不是一个列表,你可以用括号 () 替换方括号 []
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多