2017-04-13 68 views
0

是否有可能在dictcomp中使用else語句(如果是,怎麼辦?)?if-else在詞典理解中

這是不可能使用else的理解本身的一部分(見this),但至少在listset內涵,可以使用conditional_expression(見this)。

listcomp的示例是here

我的示例代碼:

converters = {"id": int} 
rows = [{"id": "1", "name": "foo"}, {"id": "2", "name": "bar"}] 
for row in rows: 
    row = {k: converters[k](v) if k in converters else k:v for k,v in row.items()} 
    print(row) 

這是行不通的。

怪異的是,

row = {k: converters[k](v) if k in converters for k, v in row.items()}也不管用,但它應該沒問題。

row = {k: converters[k](v) for k, v in row.items() if k in converters}確實有效,但這不是我想要的結果。如上所述,
row = {k: converters[k](v) for k, v in row.items() if k in converters else k:v}應該不起作用。

我知道我可以繞過使用兩個dictcomps的問題,但我想知道爲什麼這不起作用。

回答

3

這是因爲條件適用於字典的價值,而不是爲鍵值對,即其被評估爲:

row = {k: (converters[k](v) if k in converters else k:v) for k,v in row.items()} 

k:v不在這裏語法有效,它只有一對內有效大括號或功能簽名(所以,您可以將k:v置於括號內並修復SyntaxError,但這會改變最終結果)。

的解決方案是簡單地提供在有條件的價值,因爲這是改變:

row = {k: converters[k](v) if k in converters else v for k,v in row.items()} 

另一種選擇,當然是改爲提供的元組到dict構造:

row = dict((k, converters[k](v)) if k in converters else (k,v) for k,v in row.items())