Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从“创建一个列表”的算法;X";Python中的嵌套列表_Python - Fatal编程技术网

从“创建一个列表”的算法;X";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

用Python创建此列表的最简单方法是什么

首先,假设我有一个嵌套列表:

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)