2014-01-16 41 views
1

我想在列表理解中實現三元條件運算符。我寫這樣的:在列表理解中實現三元條件運算符

lst.append(dict2obj(item)) if type(item) is not in ['int'] else lst.append(item) for item in v 

哪裏lst是空表,v是另一個列表用各種元素。編輯器顯示它在語法上不正確。我究竟做錯了什麼?

+0

刪除'is'(在我所知的最好的Python中沒有這樣的關鍵字) –

+0

當然有。你可以做'x是y'。這是'不存在'。 –

+0

使用列表推導來調用函數內部並不容易閱讀,此外還有一行代碼。而且,如果'lst'是空的,@InbarRose'的答案顯然是最好的。 –

回答

3
  • 如果你的意思寫列表理解你錯過[]
  • 沒有is not in運營商。使用not in
  • type函數不返回string。爲什麼不使用isinstance(item, int)

[lst.append(dict2obj(item)) if not isinstance(item, int) else lst.append(item) 
for item in v] 

使用簡單for循環,如果可能的。它更具可讀性。

for item in v: 
    if not isinstance(item, int) 
     lst.append(dict2obj(item)) 
    else: 
     lst.append(item) 
+0

謝謝你的回答。我修改了它,但仍然顯示它在語法上不正確。 – gliese581g

+0

@ gliese581g,我更新了答案。 – falsetru

+1

由於list.append不返回任何內容,這將給出'None'的列表。你爲什麼要這樣? –

1

如果LST從一開始就是空的,你可以簡單地這樣創造的:

lst = [dict2obj(item) if not isinstance(item, int) else item for item in v] 

如果你已經有列表,並希望添加的項目,合適的方式來做到這一點Python是隻延長你有新的名單列表:

lst.extend([dict2obj(item) if not isinstance(item, int) else item for item in v]) 

或者是這樣的(它使用一個發電機),以防止額外的開銷:

map(lst.append, (dict2obj(item) if not isinstance(item, int) else item for item in v)) 
+0

'lst'被認爲是空的,爲什麼不直接做'lst = [dict2obj(...)]'這樣的事情? –

1

我避免與三元運算符混合列表理解,因爲它太難理解該函數一目瞭然。

我也嘗試使用列表推導只爲建立一個返回值的列表。如果我希望有副作用(例如將項目添加到列表中),我會在常規for循環中執行此操作。當我不關心返回值列表時,尤其如此。如果你確實走了列表理解的路線,請使用itertoolshttp://docs.python.org/2/library/itertools.html#recipes)的消耗配方。 consume((lst.append(dict2obj(item)) if not isinstance(item) else lst.append(item) for item in v), None)

以下是我想解決這個問題,如果我沒有做使用@ falsetru的做法(這可能是最容易閱讀)

def convert(item): 
    if not isinstance(item, int): 
     result = dict2obj(item) 
    else: 
     result = item 
    return result 

lst.extend(map(convert, v)) #or itertools.imap 

convert可能是一個lambda函數,如果你爲了可讀性願意交易緊湊。