假设我有一个包含(以及其他)不同类型的子列表的列表:
[1, 2, [3, 4], {5, 6}]
我希望以有选择的方式扁平化,具体取决于其元素的类型(即我只想展平sets
,而其余部分保持不变):
[1, 2, [3, 4], 5, 6]
我目前的解决方案是一个功能,但仅仅是出于我的求知欲,我想知道是否可以通过一个列表理解来实现它?
答案 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)
from funcy import flatten, isa
flat_list = flatten(your_list, follow=isa(set))
您还可以查看its implementation。