【问题标题】:Python Inline list recursivelyPython内联列表递归
【发布时间】:2014-03-02 12:38:37
【问题描述】:

我想对列表进行递归读取

例如,我有以下内容:

[x if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]]

输出是:

[2, [9, 8, 7], 4, [9, 8, 7]]

但我希望它是:

[2, 9, 8, 7, 4, 9, 8, 7]

有可能吗?

我试过了

[x if x % 2 == 0 else a for a in [9,8,7] for x in [2,3,4,5]]

并没有工作[2, 9, 4, 9, 2, 8, 4, 8, 2, 7, 4, 7]

提前致谢。

【问题讨论】:

  • itertools.chain?相当不清楚您的理解应该是什么意思。在这里,一个常规的、更明确的循环可能更具可读性。
  • 请注意,[a for a in [9, 8, 7]] 只是[9, 8, 7] 的一种写法。
  • @RemcoGerlich 啊哈哈哈哈!!好笑,那是我的错!
  • @RemcoGerlich [a for a in [9, 8, 7]] 不是[9, 8, 7][:] 的一种奇特的写法吗?毕竟这是一个新列表。在这种精确的背景下,这并不重要。
  • 是的,当然,或者list([9, 8, 7])。但是使用文字 [9, 8, 7] 当然已经创建了一个新列表。如果他使用随机迭代器而不是文字列表,它可能意味着什么,但这样写只会使表达式更难理解。

标签: python recursion


【解决方案1】:

itertools 负责这个:

from collections import Iterable
from itertools import chain

t =  [x if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]]
final_list = list(chain.from_iterable(item if isinstance(item,Iterable) and
                    not isinstance(item, basestring) else [item] for item in t))
print(final_list)

来源:flatten list of list through list comprehension

编辑:以前的解决方案的问题是它只适用于具有相同级别的值的数组(例如[[1,2], [3,4]]),而像[5, [1,2], [3,4]] 这样的数组由于不同级别的值而返回一些链对象(即5)。

【讨论】:

  • 这不起作用,引发了TypeError: 'int' object is not iterable 异常,后来打印了一个空数组!
  • 它会在print(list(chain))这一行抛出那个错误吗?
  • 是的,我只是将它复制到控制台。
【解决方案2】:

或者没有 itertools:

a = [[x] if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]]
a = [i for x in a for i in x]
print (a)

【讨论】:

  • 好的。谢谢!它工作正常,而且在一行中(正是我需要的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2017-02-21
相关资源
最近更新 更多