展平嵌套列表

3

我有数百行数据,看起来像这样:

[[u' 16 '], [u'1x23'], [u'Mr Test', u' (5)'], [u'John Smith'], [u'54.5'], [], [u'10%'], [u'40%'], [u'$26,503']]

一些值是嵌套的,而且有些也是空的。

我试图让它变成这样:

['16', '1x23', 'Mr Test', '(5)', 'John Smith', '54.5', '', '10%', '40%', '$26,503']

我尝试了一些在这里找到的想法,比如压平(flattening),包括以下例程:

def traverse(o, tree_types=(list, tuple)):
    if isinstance(o, tree_types):
        for value in o:
            for subvalue in traverse(value):
                yield subvalue
    else:
        yield o

这对我已经解析的一些表格起作用,但仅在没有空值时。


请澄清一下,您希望空值的结果为 "",还是忽略不计? - Inbar Rose
展示一下你用来构建“data”的代码。也许我们可以建议一种直接以你想要的形式构建它的方法。 - unutbu
需要注意的一点是:并非所有的子列表大小都相同。有些只有一个元素,而其他一些则有两个;如果你将列表展平,则可能会丢失诸如文件列之间的关系,并最终索引错误的内容。更好的问题是:你想对列表做什么?可能有一个值得考虑的替代数据结构。 - abought
1
无论你做什么,都不要去查看这个问题之前是否被提问过:http://stackoverflow.com/search?q=Flatten+list+of+lists+in+Python&submit=search - msw
@InbarRose,空值仍然需要存在。stummjr的答案完美地满足了我的需求。 - croc
显示剩余3条评论
3个回答

2

尝试这个:

sum((item or [""] for item in a), [])

听起来很奇怪,是吧?


优雅地从https://dev59.com/qnNA5IYBdhLWcg3wdtld中借鉴过来的 ;) - Rob Cowie
实际上,我早就从 #python 中知道了这件事。 - Jakob Bowyer
我不怀疑;我不是认真的。 - Rob Cowie

1
这个将会起作用(即使值为空):
import operator
def flatten(a):
    return reduce(operator.add, a)

这会删除空的 '' 值。 - user647772

0
如果您的唯一问题是空值,那么您可以首先在if语句中检查它:
def traverse(o, tree_types=(list, tuple)):
    if isinstance(o, tree_types):
        if len(o) == 0:
            yield ''
        for value in o:
            for subvalue in traverse(value):
                yield subvalue
    else:
        yield o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接