我如何從all_options其中關鍵匹配selected_options的條目中的條目?
有了理解。我們有兩種:列表理解和生成器理解。
注意,這取決於你所說的「項」的內容。如果你想要一個dict
的鍵/值對匹配,那麼你需要一個理解來創建鍵/值對,然後通過將它提供給dict
構造函數來創建一個字典。
有一個特殊的語法規則,說如果我們只用一個參數調用可調用的東西(比如說一個類構造函數),並且該參數是一個生成器理解,那麼我們只需要一對括號(而不是二:一個調用函數,另一個將理解標記爲理解)。這讓我們寫出非常自然的東西。
在另一方面,如果你只是想鍵的list
,那麼你可以只用一個列表理解。 (你可以通過一臺發電機理解爲list
構造,太。)
我開始走上使用列表理解的路徑...
你有錯誤的觀念,從根本上,有關如何他們工作。你不用它們重複執行一個動作;你用它們重複計算結果。你不會在聲明的第一部分進行append
調用,因爲(a)理解已經在爲你構建序列,所以沒有理由創建另一個空序列來追加; (b)在追加後append
調用返回None
,所以你最終得到一個你隨後拋棄的無值的列表。
列表解析產生一個值。生成器理解也創建一個值,但它是一個生成器(所以你必須提取它的值來使用它們)。
那麼,我們該如何寫代碼?
鍵的list
看起來是這樣的:在dict
(迭代一個dict
迭代其鍵)每個鍵,我們想要一個鍵(無修改),只要關鍵是在我們的其他list
。那就是,我們想要[key for key in all_options if key in selected_options]
。這正是你如何用Python編寫的。一種語言很難自然地閱讀而仍然毫無疑義。
一個鍵值對的dict
看起來是這樣的:在dict
的鍵值對每個鍵值對,我們要的是對,只有關鍵是在我們的其他list
。我們想要使用這些鍵值對創建一個dict
,所以我們將理解包含在dict
構造函數中。爲了從字典中獲得鍵值對,我們遍歷其.items()
。所以,我們想要一個dict
構造從一個鍵和值,對於原始dict
的項目中的每個鍵和值,其中密鑰在另一個list
中。再次,這正是我們寫的:dict((key, value) for (key, value) in all_options if key in selected_options)
。
在更新版本的Python中,我們也可以使用「詞典理解」,它基本上是語法糖,因此我們可以編寫看起來更像列表理解的東西。
這是使用列表解析的錯誤方法。你正在創建一個None的大名單並把它扔掉。只要用'final = [...]' –