2014-01-16 43 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函数,如果你为了可读性愿意交易紧凑。