我已经写了一些像这样的代码,它可以正常工作并做我想做的事情:
#!/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:语法无效
是的,我在列表中理解的内容似乎是无意义的,毫无疑问编译器不知道我想要做什么。
是否可以做我尝试使用列表理解的内容?
答案 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
真的很长,那么您仍然只能阅读一次,并且在继续之前您不必等待完全阅读。