选择性展平Python列表

时间:2012-10-26 17:03:49

标签: python list list-comprehension flatten

假设我有一个包含(以及其他)不同类型的子列表的列表:

[1, 2, [3, 4], {5, 6}]

我希望以有选择的方式扁平化,具体取决于其元素的类型(即我只想展平sets,而其余部分保持不变):

[1, 2, [3, 4], 5, 6]

我目前的解决方案是一个功能,但仅仅是出于我的求知欲,我想知道是否可以通过一个列表理解来实现它?

3 个答案:

答案 0 :(得分:6)

列表推导不是为扁平化而设计的(因为它们无法组合对应于多个输入项的值)。

虽然可以通过嵌套列表推导解决这个问题,但这需要您的顶级列表中的每个元素都是可迭代的。

老实说,只需使用一个功能。这是最干净的方式。

答案 1 :(得分:4)

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速度发生的,这通常都很好。

答案 2 :(得分:1)

您可以使用flatten库中的funcy功能:

from funcy import flatten, isa

flat_list = flatten(your_list, follow=isa(set))

您还可以查看its implementation