从“创建一个列表”的算法;X";Python中的嵌套列表
用Python创建此列表的最简单方法是什么 首先,假设我有一个嵌套列表:从“创建一个列表”的算法;X";Python中的嵌套列表,python,Python,用Python创建此列表的最简单方法是什么 首先,假设我有一个嵌套列表: oldList = [ [{'letter':'a'}], [{'letter':'b'}], [{'letter':'c'}] ] 我想要一个函数来吐出: newList = [ {'letter':a}, {'letter':'b'}, {'letter':'c'} ] 嗯,这可以手动完成。但是,如果有三个嵌套的X嵌套 棘手的?:) 从该链接(有几个小改动: def flatten(l): if isinst
oldList = [ [{'letter':'a'}], [{'letter':'b'}], [{'letter':'c'}] ]
我想要一个函数来吐出:
newList = [ {'letter':a}, {'letter':'b'}, {'letter':'c'} ]
嗯,这可以手动完成。但是,如果有三个嵌套的X嵌套
棘手的?:)
从该链接(有几个小改动:
def flatten(l):
if isinstance(l, list):
return sum(map(flatten,l),[])
else:
return [l]
Martelli、Ravencroft和Asher 2005 O'Reilley也为这一扁平化问题提供了解决方案。请参见4.6展平嵌套序列。
此解决方案使用生成器,如果列表很长,这可能是一件好事。
此外,该解决方案同样适用于列表或元组 注意:哎呀…我有点匆忙。我不确定在这里复制这个片段的合法性。。。 让我看看这方面的政策/先例 编辑:后来找到了作为谷歌图书预览版的参考
在中,这里有一个到本书这一部分的链接,递归解决方案是最简单的,但在您遇到关于太深递归的异常之前,最多只能有几千层嵌套。为了真正的通用性,您可以通过保留自己的堆栈来消除递归;迭代器是保留所述堆栈的好东西,并且整个函数的最好作为生成器编写(如果您真的想要一个巨大的列表结果,只需调用
list(展平(列表))
)
现在,这应该可以让您处理尽可能多的嵌套级别,只要您有;-)的虚拟内存。我还是喜欢Alex Martelli的帖子。只想添加一个不推荐的技巧:
from Tkinter import _flatten
print _flatten(oldList)
最简单的答案是 只有您可以阻止嵌套列表
不要使用
append
创建列表列表。使用extend
创建一个平面列表 太宽泛了:例如,一个dict也有一个\uuu iter\uuuu
,但OP的例子完全清楚地表明,他不想“扁平化”dict,只想列出!)说得好。那是我对原作的不必要的编辑。(另一个编辑是sum的第二个参数)旁注:PEP 8鼓励不要使用小写L作为标识符。这会降低代码的可读性,因为l
(l)看起来像1
(一)。您还可以使用sys增加递归限制。setrecursionlimit@Alex字体很高兴在这里见到你。有点抱歉,这里是我的回复。版权等?(顺便说一句,伟大的非递归sol')@gnibbler,只有一个极限,而不是没有边界@mjv,通过发布一个指向谷歌图书片段的链接,你肯定很清楚(不确定O'Reilly对在其他公共论坛(如本论坛)上再版的感受)。@Alex M感谢你的提示。希望出版商能将其视为免费广告不过,回到编码上来……作为该配方的合著者(是的,Luther Blissett,c'est moi!-),我知道最后一个,最先进的递归删除配方有点太花哨了——我在上面的回答中写的版本(从头开始,没有复制)稍微优化了一点(pop/append对的数量比严格要求的要多一些……但它们是廉价的操作!),但是,IMHO,更容易理解(没有else
分支,而打印版本有两个;-)。不难。重复:,这本身就是其他问题的重复。重复的还有:
from Tkinter import _flatten
print _flatten(oldList)