在 Python 中从嵌套列表中提取字符串 [duplicate]

Extracting strings from nested lists in Python [duplicate]

提问人:Marius 提问时间:2/21/2012 最后编辑:CommunityMarius 更新时间:2/21/2012 访问量:4964

问:

这个问题在这里已经有答案了:
11年前关闭。

可能的重复:
在 Python 中展平(不规则)列表

我正在尝试使用 python 中的 nltk 库,更具体地说是 wordnet 语料库,以提取像“动物”这样的广泛语义类别中的所有单词。我已经设法编写了一个函数,该函数遍历所有类别并提取其中的单词,但我最终得到的是列表中的大量列表。这些列表没有任何可预测的长度或深度,它们如下所示:

['pet', 'pest', 'mate', 'young', 'stunt', 'giant', ['hen', 'dam', 'filly'], ['head', 'stray', 'dog', ['puppy', 'toy', 'spitz', 'pooch', 'doggy', 'cur', 'mutt', 'pug', 'corgi', ['Peke'], ['chow'], ['feist', 'fice'], ['hound', ['Lhasa', 'cairn']], ['boxer', 'husky']], ['tabby', 'tabby', 'queen', 'Manx', 'tom', 'kitty', 'puss', 'pussy', ['gib']]]

我想要的是能够从中获取每个字符串,并返回一个未嵌套的列表。有什么建议吗?

python 嵌套列表

评论

1赞 kindall 2/21/2012
在另一个线程中也有一些解决方案,如何在 Python 中以最佳方式将多维列表转换为单个项目列表? (特别是,我喜欢我在该线程中发布的非递归解决方案)。
0赞 CppLearner 2/21/2012
一周前,我刚刚在 Scheme 中这样做了,类似于 Li-aung 提供的。stackoverflow.com/questions/9262570/......
0赞 Li-aung Yip 2/21/2012
这是一个很酷的把戏,@kindall。

答:

3赞 Li-aung Yip 2/21/2012 #1

通常,当您必须处理任意级别的嵌套时,递归解决方案是一个不错的选择。列表中的列表,解析 HTML(标记中的标记),使用文件系统(目录中的目录)等。

我还没有对这段代码进行广泛的测试,但我相信它应该做你想要的:

ll = [ 1, 2, 3, [4, 5, [6, 7, 8]]]

def flatten(input_list):
    output_list = []
    for element in input_list:
        if type(element) == list:
            output_list.extend(flatten(element))
        else:
            output_list.append(element)
    return output_list

print (flatten(ll)) #prints [1, 2, 3, 4, 5, 6, 7, 8]

一般来说,递归很容易思考,解决方案往往非常优雅(如上所述),但对于真正非常深嵌套的东西——想想数千个层次——你可能会遇到堆栈溢出等问题。

一般来说这不是问题,但我相信递归函数总是可以*转换为循环(它看起来不那么好。

  • 注意:我在这里对我的 compsci 理论并不热衷。如果我错了,有人可以添加详细信息或纠正我。

评论

0赞 Marius 2/21/2012
谢谢!我实际上试图做一些非常相似的事情,我认为它失败的原因是我使用了 .append(),而您使用了 .extend()。您的答案也比其他线程中的一些解决方案更容易理解(至少对我来说是这样)。
0赞 Li-aung Yip 2/21/2012
是的,将单个项目添加到列表的末尾。 “unpacks” ,添加其每个元素。请注意,这实际上适用于任何可迭代类型,包括列表、字典和生成器,以及任何带有方法的类型。list.append(x)xlist.extend(x)xextend__iter__()
0赞 Li-aung Yip 2/23/2012
刷了我的compsci。准确地说,循环 + 堆栈 = 递归。你可以先做深度优先,也可以先做广度。