【问题标题】:Flattening mixed lists in Python (containing iterables and noniterables) [duplicate]在 Python 中展平混合列表(包含可迭代和不可迭代)[重复]
【发布时间】:2010-07-03 21:26:43
【问题描述】:

可能重复:
Flatten (an irregular) list of lists in Python

如何在 Python 中展平包含可迭代和不可迭代的列表,例如 [1, [2, 3, 4], 5, [6]]?结果应该是 [1,2,3,4,5,6],并且列表列表(等)的列表肯定不会出现。

我曾尝试使用 itertools.chain 等,但它们似乎只适用于列表列表。救命!

【问题讨论】:

  • @KennyTM,不:Q 是专门关于任意嵌套列表的,而这个只希望下降一个级别 - 非常不同的问题,递归(或递归消除)会非常不合适,简单的迭代就可以了,请参阅我的 A.

标签: python list arrays


【解决方案1】:

因此,您只想展平 1 或 2 个级别,而不是递归到更进一步的部门;并且仅在列表中,而不是其他可迭代对象,例如字符串、元组、数组……我的规范是否正确?好的,如果是,那么……:

def flat2gen(alist):
  for item in alist:
    if isinstance(item, list):
      for subitem in item: yield subitem
    else:
      yield item

如果你想要一个列表结果,list(flat2gen(mylist)) 会产生它。

如果您的实际规格略有不同,希望这对您来说很容易适应!

【讨论】:

  • 完美;谢谢! timeit 的初步试验表明它可能有点太慢了,但鉴于这种情况,我认为别无选择。
  • @etotheipi,对于您的应用程序来说,典型的、有意义的“基准alist”是什么,您获得它的时间是什么(以及在什么平台上)以及哪些更好的就足够了?可以通过多种方式进行调整和优化,但不是在真空中,所以这些东西都是需要的(理想情况下是在一个新问题中,以便让宽敞的 A 得到答案,而不是挤满了评论线程;也理想情况下一些典型的“基准alist”,不仅仅是1)。
  • 别介意我说的——我没有转换timeit的单位,我错误地认为这个函数太慢了(doh!)。实际上,在我的机器上需要大约 56 微秒来咀嚼比实际大小的输入(最多 8-10 项)大 15 倍的输入,所以这正是我所需要的。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多