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

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

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

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

我想要一个函数吐出来:

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

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

棘手? :)

【问题讨论】:

标签: python


【解决方案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 创建一个平面列表。

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多