在列表理解中实现三元条件运算符

时间:2014-01-16 08:50:07

标签: python list list-comprehension conditional-operator

我试图在列表理解中实现三元条件运算符。我写得像这样:

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

其中lst为空列表,v是另一个包含各种元素的列表。编辑器在语法上显示它不正确。我做错了什么?

3 个答案:

答案 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循环中执行此操作。当我不关心返回值列表时尤其如此。如果您确实使用了列表理解的路径,请使用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)

如果我没有使用@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函数。