我试图在列表理解中实现三元条件运算符。我写得像这样:
lst.append(dict2obj(item)) if type(item) is not in ['int'] else lst.append(item) for item in v
其中lst
为空列表,v
是另一个包含各种元素的列表。编辑器在语法上显示它不正确。我做错了什么?
答案 0 :(得分:5)
[
,]
: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)
答案 1 :(得分: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))
答案 2 :(得分:1)
我避免将列表推导与三元运算符混合在一起,因为它很难理解函数的一目了然。
我还尝试仅使用列表推导来构建返回值列表。如果我想要副作用(例如将项添加到列表中),我将在常规的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)
如果我没有使用@fattru的方法(这可能是最容易阅读的),我将如何解决这个问题
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函数。