一种从 Python 中的“X”嵌套列表创建一个列表的算法

Posted

技术标签:

【中文标题】一种从 Python 中的“X”嵌套列表创建一个列表的算法【英文标题】:An ALGORITHM to create one list from "X" nested lists in Python 【发布时间】:2010-12-04 03:59:10 【问题描述】:

在 Python 中创建此列表的最简单方法是什么?

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

oldList = [ ['letter':'a'], ['letter':'b'], ['letter':'c'] ]

我想要一个函数吐出来:

newList = [ 'letter':a, 'letter':'b', 'letter':'c' ]

嗯,这可以手动完成。但是,如果有三个嵌套呢? ...X 嵌套

棘手? :)

【问题讨论】:

并不棘手。重复:***.com/questions/716477/join-list-of-lists-in-python,它本身就是其他问题的重复。 这个的重复,还有:***.com/questions/1077015/… 【参考方案1】:

http://www.daniel-lemire.com/blog/archives/2006/05/10/flattening-lists-in-python/

来自该链接(有几个小的改动:

def flatten(l):
  if isinstance(l, list):
     return sum(map(flatten,l),[])
  else:
     return [l]

【讨论】:

太宽泛了:例如,一个字典也有一个__iter__,但 OP 的示例完全清楚地表明他不想“扁平化”字典,只想要列表! :) 好点。这是我对原作不必要的编辑。 (另一个编辑是 sum 的第二个参数) 附注:PEP 8 鼓励不要使用小写 L 作为标识符。这会降低代码的可读性,因为 l (L) 看起来像 1 (one)。【参考方案2】:

Python Cookbook Martelli、Ravenscroft 和 Asher 2005 O'Reilley 也为这个扁平化问题提供了解决方案。 请参阅4.6 展平嵌套序列。 此解决方案使用生成器,如果列表很长,这可能是一件好事。 此外,此解决方案同样适用于列表或元组。

注意:糟糕……我有点赶时间。我不确定在此处复制此 sn-p 的合法性... 让我看看这方面的政策/先例。

编辑:后来发现作为 Google 图书预览的参考。

这是本书这一部分的链接Google books

【讨论】:

作为该配方的合著者(是的,Luther Blissett,c'est moi!-),我知道最后一个,最先进的,递归删除配方有点太花哨了——我在上面的答案中编写的版本(从头开始,没有复制)的优化程度略低(比严格需要的弹出/追加对多一点......但它们是廉价的操作!),但是,恕我直言,更容易理解(没有else 分支,而印刷版有两个;-)。【参考方案3】:

递归解决方案是最简单的,但在您得到关于太深递归的异常之前,最多只能嵌套几千层。为了真正的普遍性,您可以通过保留自己的堆栈来消除递归;迭代器是保存在所述堆栈上的好东西,整个函数最好写成生成器(如果你真的想要一个巨大的列表结果,只需调用 list(flatten(thelist)))。

def flatten(alist):
  stack = [iter(alist)]
  while stack:
    current = stack.pop()
    for item in current:
      if isinstance(item, list):
        stack.append(current)
        stack.append(iter(item))
        break
      yield item

现在 this 应该可以让您处理与虚拟内存一样多的嵌套级别;-)。

【讨论】:

你也可以使用 sys.setrecursionlimit 增加递归限制 @Alex:很高兴在这里见到你。抱歉有点元,这里是我的回复。版权等? (顺便说一句,伟大的非递归 sol') @gnibbler,只有一个限制,而不是没有限制。 @mjv,通过发布指向 google 图书 sn-p 的链接,您肯定是清楚的(不确定 O'Reilly 对在其他公共论坛(例如这个论坛)的再版有何看法)。 @Alex M 感谢您的提示。希望出版商将其视为免费广告。 '这已经够了,回到编码......【参考方案4】:

像往常一样,我更喜欢 Alex Martelli 的帖子。只想添加一个不推荐的技巧:

from Tkinter import _flatten
print _flatten(oldList)

【讨论】:

【参考方案5】:

最简单的答案就是这个

只有您可以阻止嵌套列表

不要使用append 创建列表列表。使用extend 创建一个平面列表。

【讨论】:

以上是关于一种从 Python 中的“X”嵌套列表创建一个列表的算法的主要内容,如果未能解决你的问题,请参考以下文章

dataframe中stu用法

python 使用嵌套的for循环创建二维列表?

Python 嵌套惰性列表

将 HTML(无序列)列表转换为嵌套的 Python 字典

Pyspark 将列表列转换为嵌套结构列

python 展开嵌套列表