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

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

Possible Duplicate:

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

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

在另一个线程中也有一些解决方案,如何在python中将多提及的列表最佳化为单个项目列表?(特别是,我喜欢我在该线程中发布的非递归解决方案)。

我一周前在这个计划中做的,和李昂的提议类似。stackoverflow.com/questions/9262570/…

这是一个很酷的把戏,@kindall。

一般来说,当您必须处理任意层次的嵌套时,递归解决方案是一种很好的适合性。列表中的列表,解析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]

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

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

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

谢谢!实际上,我试图做一些类似的事情,我认为失败的原因是我在使用.extend()的地方使用了.append()。你的答案(至少对我来说)也比另一条线索中的一些解决方案更容易理解。

是的,list.append(x)在列表的末尾添加了一个项目x。list.extend(x)对x进行"解包",添加每个元素。注意,extend实际上适用于任何不可重复的类型,包括列表、dict和生成器,以及任何使用__iter__()方法的类型。

循环==递归。

回顾一下我的作品。准确地说,循环+堆栈=递归。你可以先做深度,或者先做宽度。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值