在python中,如何设置复杂的列表理解

时间:2017-07-20 02:02:24

标签: python list python-3.x list-comprehension

我正在努力应用我所学到的关于列表理解和阅读Pep 8的内容。我遇到了风格困境。首先,代码:

# Using nested for's and conditionals
for m, row in enumerate(board):
    for n, piece in enumerate(row):
        if (piece == self.color or piece == self.Color):
            print(m, n, piece)

# Using list comprehensions
[
    [
        print(m, n, piece)
        for n, piece in enumerate(row)
        if (piece == self.color or piece == self.Color)
    ]
    for m, row in enumerate(board)
]

对我来说,我认为Pep 8倾向于嵌套式的方法,因为(对我来说)它看起来更直观一些。也许我并没有很好地接近列表理解的格式。这是我能想到的最好的格式,同时保持79 col优先换行。

我认为我在这一点上已经很好地掌握了列表理解,并且它们绝对适用于我认为的这个应用程序但是...为了使用列表推导而优先使用列表推导?

也许我只需要完全重新考虑我的代码架构?我不希望SO为此提出这样的建议(!),但也许对上面显示的哪种方法有一些见解会更好地看看那里的Pythonistas!

编辑:推荐的重复问题(在创建问题时没有在推荐的欺骗中弹出这个问题,否则我不会问!:D)完美地解决了这个问题。我想我应该更多地了解"副作用"列表理解,因为我的问题肯定是这样。

Here's the duplicate link以防重复标记被删除:

一如既往,感谢SO SO!

1 个答案:

答案 0 :(得分:2)

我认为上述方法具有更好的可读性。 列表推导生成列表而不是做某事......它只是副作用。

for m, row in enumerate(board):
    for n, piece in enumerate(row):
        if piece == self.color or piece == self.Color:
            print(m, n, piece)

够了。

或者你必须要使用列表推导,然后生成列表并像这样打印。

result = [
    [
        (m, n, piece)
        for n, piece in enumerate(row)
        if piece == self.color or piece == self.Color
    ] 
    for m, row in enumerate(board)
]
print (result)

for res in result:
    m, n, piece = res
    print (m, n, piece)