2017-07-20 65 views
1

我正在應用我所學到的有關列表解析和通過Pep 8的閱讀。我遇到了文體困境。首先,代碼:在python中,如何設計一個複雜的列表理解

# 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) 
] 

給我,我會認爲佩普8排序斜靠朝嵌套了的做法,只是因爲(我),它看起來稍微更加直觀。也許我並沒有很好地理解列表理解的格式。這是我所能想到的最好的格式,同時保持79 col首選的包裝。

我認爲在這一點上我已經很好地掌握了列表解析,他們絕對適用於我認爲的這個應用程序,但是......它僅僅爲了使用列表解析而喜歡使用列表解析?

也許我只是需要重新考慮我的代碼架構?我不希望所以對這個(!)做出這樣的建議,但也許有一些洞察力,上面顯示的方法會更好地看待那裏的Pythonistas!

編輯:推薦的重複問題(在創建問題時沒有看到這個彈出的建議模式,否則我不會問!:D)完美地解決了這個問題。我想我應該更多地閱讀關於列表解析的「副作用」的含義,因爲我的問題肯定會出現這種情況。

Here's the duplicate link的情況下,重複的標記獲取刪除:

一如既往,感謝這麼偉大的答案!

+3

它不建議使用副作用列表內涵。只需使用一個循環。 – AChampion

+0

您發佈的代碼由於在列表理解中進行了打印而產生語法錯誤。你可能意思是'''print [[(m,n,piece)...]]''' – perigon

+0

@ user55449你確定你使用的是正確版本的python嗎? – AChampion

回答

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)