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] |
一般来说,递归是很容易想到的,而且解决方案往往非常优雅(如上所述),但是对于真正的、非常深的嵌套的东西——想想数千层的深度——您可能会遇到堆栈溢出之类的问题。
一般来说,这不是问题,但我相信递归函数可以*转换为循环(只是看起来不太好)。
- 注:我不热衷于我的康普科学理论。如果我错了,有人可以添加细节或纠正我。