从Python中的嵌套列表中提取字符串

时间:2012-02-21 05:06:14

标签: python nested-lists

  

可能重复:
  Flatten (an irregular) list of lists in Python

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

['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']]]

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

1 个答案:

答案 0 :(得分:3)

通常,当你必须处理任意级别的嵌套时,递归解决方案是一个很好的选择。列表中的列表,解析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理论上并没有崩溃。如果我错了,有人可以添加细节或纠正我。