我想在列表理解中實現三元條件運算符。我寫這樣的:在列表理解中實現三元條件運算符
lst.append(dict2obj(item)) if type(item) is not in ['int'] else lst.append(item) for item in v
哪裏lst
是空表,v
是另一個列表用各種元素。編輯器顯示它在語法上不正確。我究竟做錯了什麼?
我想在列表理解中實現三元條件運算符。我寫這樣的:在列表理解中實現三元條件運算符
lst.append(dict2obj(item)) if type(item) is not in ['int'] else lst.append(item) for item in v
哪裏lst
是空表,v
是另一個列表用各種元素。編輯器顯示它在語法上不正確。我究竟做錯了什麼?
[
,]
: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)
謝謝你的回答。我修改了它,但仍然顯示它在語法上不正確。 – gliese581g
@ gliese581g,我更新了答案。 – falsetru
由於list.append不返回任何內容,這將給出'None'的列表。你爲什麼要這樣? –
如果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))
'lst'被認爲是空的,爲什麼不直接做'lst = [dict2obj(...)]'這樣的事情? –
我避免與三元運算符混合列表理解,因爲它太難理解該函數一目瞭然。
我也嘗試使用列表推導只爲建立一個返回值的列表。如果我希望有副作用(例如將項目添加到列表中),我會在常規for循環中執行此操作。當我不關心返回值列表時,尤其如此。如果你確實走了列表理解的路線,請使用itertools
(http://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函數,如果你爲了可讀性願意交易緊湊。
刪除'is'(在我所知的最好的Python中沒有這樣的關鍵字) –
當然有。你可以做'x是y'。這是'不存在'。 –
使用列表推導來調用函數內部並不容易閱讀,此外還有一行代碼。而且,如果'lst'是空的,@InbarRose'的答案顯然是最好的。 –