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

Extracting strings from nested lists in Python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Flatten (an irregular) list of lists in Python

我正在尝试使用Python中的NLTK库,更具体地说是WordNet语料库,来提取广泛语义类别中的所有单词,如"animal"。我已经成功地编写了一个函数,它遍历所有类别并提取其中的单词,但最终得到的却是列表中的一大堆列表。列表的长度和深度都不可预测,它们如下所示:

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

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


一般来说,当您必须处理任意层次的嵌套时,递归解决方案是一种很好的适合性。列表中的列表,解析HTML(标记中的标记),使用文件系统(目录中的目录)等。

我没有广泛地测试过这段代码,但我相信它应该按照您的要求来做:

1
2
3
4
5
6
7
8
9
10
11
12
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]

一般来说,递归是很容易想到的,而且解决方案往往非常优雅(如上所述),但是对于真正的、非常深的嵌套的东西——想想数千层的深度——您可能会遇到堆栈溢出之类的问题。

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

  • 注:我不热衷于我的康普科学理论。如果我错了,有人可以添加细节或纠正我。