【问题标题】:Python str() not called by list comprehensionPython str() 未被列表理解调用
【发布时间】:2018-10-03 14:31:33
【问题描述】:

当我使用列表推导式时,与仅使用 for 循环相比,当我打印嵌套的对象列表时会得到不同的结果。

class Feature:
    def __str__(self) -> str:
        return 'f'

featList = [[Feature() for j in range(3)] for i in range(10)]

[print(str(f)) for f in [r for r in featList]]

for r in featList:
    [print(str(f)) for f in r]

第一次打印给了我类似的东西:

[ma​​in.Feature 对象在 0x0000026AB6371588>, ma​​in.Feature 对象位于 0x0000026AB63BA8D0>, ma​​in.Feature 对象位于 0x0000026AB4966BE0>]

第二次打印给我 30 次“f”。

【问题讨论】:

  • [print(str(f)) for f in [r for r in featList]] 这会将打印函数对象返回到您的列表中。这就是它的工作原理。虽然我不知道为什么你需要把 print 放在你的列表中.....
  • f 不会遍历每个人 r;它正在遍历rslists 列表
  • 您在对象列表上调用 str,而不是在 Feature 上。虽然在将列表转换为字符串时,它会调用 repr 来获取对象的可打印版本。不过,您应该使用循环,因为它们有意义。

标签: python list-comprehension


【解决方案1】:

问题是你如何迭代

featList = [[Feature() for j in range(3)] for i in range(10)]

功能列表列表

a = [f for f in [r for r in featList]]

a 是功能列表的列表(仍然) 你可以这样做

a = [ f for r in featList for f in r]

这是一个 f 的列表,所以现在你可以为所欲为。

[ print(str(f)) for r in featList for f in r]

如果您在Python's Docs 看到列表理解部分的最后一部分

你会看到有例子,对于这样的情况(双重列表理解)

把它想象成一个普通的for

# Regular for
for a in A
   for b in A
       f(b)

# Comprehended Loop
a = ( f(b) for a in A for b in a)

除了语句之外,顺序几乎相同。

【讨论】:

    【解决方案2】:

    它适用于列表理解,但你应该重写你的列表理解

    [print(f) for r in featList for f in r]
    

    如果你想跑

    [print(str(f)) for f in [r for r in featList]]
    

    你可以在Feature 中实现__repr__

    def __repr__(self) -> str:
        return 'f'
    

    希望对你有帮助:)

    【讨论】:

    • 提及 repr 很有帮助。我尝试投票,但还没有足够的声望点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多