我有一个列表,可以包含列表或整数或无。我想在此列表中将可迭代元素(现在仅假设列表)展平为单个元素。
例如:
[[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循环吗?
答案 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]