当列表包含另一个列表的 1 个单个项目时,展平嵌套列表
Posted
技术标签:
【中文标题】当列表包含另一个列表的 1 个单个项目时,展平嵌套列表【英文标题】:Flatten nested lists when list contains 1 single item which is another list 【发布时间】:2019-05-07 14:35:40 【问题描述】:基本上,我正在尝试查看当列表包含 1 个单个项目(另一个列表)时是否可以展平嵌套列表。以这个数据结构为例:
[['a', 'b', 'c', [['d', 'e', 'f']]]]
理想的数据格式是:
['a', 'b', 'c', ['d', 'e', 'f']]
这种嵌套可以深入到任意数量的级别,但只需要展平单个列表数据。有人知道这样做的方法吗?我在 SO 上得到的最接近的答案是:Flattening a list recursively 但这完全使整个列表变平。
【问题讨论】:
那么如果嵌套列表有两个以上的元素你不想展平它? 不,这是摄取数据的产物。如果它是[['a', 'b', 'c'], 'd']
之类的东西,它不应该被展平,这是一个非常精确的情况。
【参考方案1】:
您可以使用递归函数专门测试给定列表中是否只有一项,以及该项是否为列表,如果是,则跳过生成该列表:
def simplify(l):
if len(l) == 1 and isinstance(l[0], list):
yield from simplify(l[0])
else:
for i in l:
yield list(simplify(i)) if isinstance(i, list) else i
这样:
list(simplify([['a', 'b', 'c', [['d', 'e', 'f']]]]))
返回:
['a', 'b', 'c', ['d', 'e', 'f']]
【讨论】:
【参考方案2】:递归函数可以做到这一点:
def flatten(l: list):
if len(l) == 1:
if isinstance(l[0], list):
l = l[0]
for i, elem in enumerate(l):
if isinstance(type(elem), list):
l[i] = flatten(elem)
return l
【讨论】:
以上是关于当列表包含另一个列表的 1 个单个项目时,展平嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]