列表解析未调用Python str()

时间:2018-10-03 14:31:34

标签: python list-comprehension

使用列表理解时,与仅使用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]

第一张照片给了我类似的东西

  

[<< strong> main 。功能对象位于0x0000026AB6371588>, main 。功能   对象位于0x0000026AB63BA8D0>,。功能对象位于   0x0000026AB4966BE0>]

第二张照片给了我“ f” 30次。

2 个答案:

答案 0 :(得分:0)

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

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

如果要运行

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

比您可以在__repr__中实现Feature

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

希望它会对您有所帮助:)

答案 1 :(得分:0)

问题是您如何迭代

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]

an这是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)

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