如果是python嵌套列表理解中的其他逻辑

时间:2016-12-11 23:53:52

标签: python python-2.7 list nested list-comprehension

我有一个列表,可以包含列表或整数或无。我想在此列表中将可迭代元素(现在仅假设列表)展平为单个元素。

例如:

[[0, 1], [2, 3], 1, 3, 4, 0, None] into [0,1,2,3,1,3,4,0,None] 

使用列表理解。我发现了另一个类似的问题,但所有这些元素在该列表中都是可迭代的,因为我的整数也是整数,如何在第一个" for循环"的列表理解中使用if else逻辑。我正在尝试这样的事情,但不确定准确的语法是什么样的。

  

[ item sublist if isinstance(sublist,list)else [sublist] for   子目录中的项目A中的子列表]

基于其他问题,if-else应该在for循环之前发生,for循环必须按顺序发生。我无法在第一个for循环之后插入if else,语法只允许if而不是else。

有人可以帮助解决这个问题的句法,在第一个for循环中执行if-else或者在理解中嵌套for循环中的任何中间for循环吗?

2 个答案:

答案 0 :(得分:2)

您可以使用生成器将混合列表转换为只包含列表的迭代:

gen = (x if isinstance(x, collections.Iterable) else [x] for x in A)

然后你可以使用标准的扁平化成语来平整发电机:

flattened = [y for x in gen for y in x]

答案 1 :(得分:0)

@mgilson使用理解提供了一个优雅的解决方案。也可以使用错误捕获在自然循环中执行此操作:

items = [[0, 1], [2, 3], 1, 3, 4, 0, None]
flattened = []
for item in items:
    try:
        flattened.extend(item)
    except TypeError:
        flattened.append(item)

print(flattened) #prints [0, 1, 2, 3, 1, 3, 4, 0, None]