假设我有一个列表,其中包含不同类型的子列表:
[1, 2, [3, 4], {5, 6}]我想根据元素的类型选择性地展平它(例如,我只想展平sets,其余的不展平):
[1, 2, [3, 4], 5, 6]我目前的解决方案是一个函数,但出于我对知识的好奇心,我想知道是否可以用单个列表理解来实现它?
发布于 2012-10-27 01:08:38
列表理解不是为扁平化而设计的(因为它们不能组合对应于多个输入项的值)。
虽然您可以使用嵌套列表理解来解决此问题,但这要求顶级列表中的每个元素都是可迭代的。
老实说,使用一个函数就可以了。这是最干净的方法。
发布于 2012-10-27 01:15:37
Amber可能是对的,对于这样的事情,函数更可取。另一方面,总有一些变化的余地。我假设嵌套永远不会超过一层深度--如果它曾经超过一层深度,那么您肯定应该为此选择一个函数。但如果没有,这是一种潜在的可行方法。
>>> from itertools import chain
>>> from collections import Set
>>> list(chain.from_iterable(x if isinstance(x, Set) else (x,) for x in l))
[1, 2, [3, 4], 5, 6]这样做的非itertools方法将涉及嵌套列表理解。最好把它分成两行:
>>> packaged = (x if isinstance(x, collections.Set) else (x,) for x in l)
>>> [x for y in packaged for x in y]
[1, 2, [3, 4], 5, 6]我没有很强的直觉来判断这两个函数是否会比一个简单的函数更快或更慢。这会创建许多单例元组--这有点浪费--但它们也是以LC速度发生的,这通常是很好的。
发布于 2014-06-04 23:40:03
您可以使用funcy库中的flatten函数:
from funcy import flatten, isa
flat_list = flatten(your_list, follow=isa(set))你也可以浏览一下its implementation。
https://stackoverflow.com/questions/13091284
复制相似问题