Python列表理解 - 条件for-loop

时间:2015-05-20 00:44:58

标签: python-3.x

我已经写了一些像这样的代码,它可以正常工作并做我想做的事情:

#!/usr/bin/env python3

myList = [[0], [1, 2], {'val': [3, 4, 5]}, [6]]

flat1 = []
for sublist in myList:
    if type(sublist) is list:
        for item in sublist:
            flat1.append(item)
    else:
        for item in sublist['val']:
            flat1.append(item)

print(flat1)

所以它在标准嵌套列表展平上有所改变。扭曲的是,一些嵌套的项目实际上不是列表,而是带有' val' (在这些情况下,我们希望' val'列表中的项目。)

我试图让它成为列表理解。这是我尝试过的:

flat2 = [item for sublist in myList for item in sublist if type(sublist) is list else for item in sublist['val']]
print(flat2)

我发现以下错误,其中插入符号为' else'。

  

SyntaxError:语法无效

是的,我在列表中理解的内容似乎是无意义的,毫无疑问编译器不知道我想要做什么。

是否可以做我尝试使用列表理解的内容?

2 个答案:

答案 0 :(得分:3)

[item
    for sublist in myList
    for item in (sublist if type(sublist) is list else sublist['val'])
]

答案 1 :(得分:1)

首先,我建议不要这样做。你为什么要把那些已经很可读的东西拿出来并压缩它以使它不可读?

body.modal-open {padding-right: 0 !important}
body.modal-open nav,
body.modal-open section,
body.modal-open footer {padding-right: 17px !important}

阅读评论后更新

要做的一件好事是将列表理解分为两个步骤:

flattened =  [i for iterable in 
              (j if type(j) is list else j["val"] for j in myList)
              for i in iterable]

这更具可读性 - 同样具有计算效率。注意在iterables = (j if type(j) is list else j["val"] for j in myList) flattened = [i for iterable in iterables for i in iterable] 中使用括号 - 这使得它成为一个懒惰评估的生成器。这样,如果iterables真的很长,那么您仍然只能阅读一次,并且在继续之前您不必等待完全阅读。