从嵌套列表创建整数列表?

时间:2012-11-23 03:32:16

标签: python nested-lists

我有一个嵌套列表,例如:

 test = [[15, [7, [None], [11, [None], [13, [None], [None]]]], [None]], [20, [None], [None]]] 

我想要从中创建另一个列表,只包含嵌套中的整数。哪会归还:

[15, 7, 11, 13, 20]

我已经完成了这个递归函数来完成我需要完成的任务但是,我不禁认为这不是最好的方法。有更多的pythonic或有效的方法吗?

def nest_search(nest, hold=[]):
    for item in nest:
        if isinstance(item, int):
            hold.append(item)
        if isinstance(item, list):
            nest_search(item, hold)
    return hold

>>> print nest_search(test)
[15, 7, 11, 13, 20]

2 个答案:

答案 0 :(得分:2)

我唯一看到的是unpythonic是默认参数。请参阅this question,了解为什么它不会按预期方式运作。

以下是我修复它的方法:

def nest_search(nest, hold=None):
    if hold is None:
        hold = []
    for item in nest:
        if isinstance(item, int):
            hold.append(item)
        if isinstance(item, list):
            nest_search(item, hold)
    return hold

另一种实现方法是使函数成为生成器,它逐个生成值,而不是将它们添加到它最后返回的列表中。 (如果确实需要列表,只需在list构造函数中包装生成器调用)。

def nest_search_gen(nest):
    for item in nest:
        if isinstance(item, int):
            yield item
        if isinstance(item, list):
            yield from nest_search_gen(item)

这使用Python 3.3中引入的新yield from语法。如果您使用的是早期版本,则可以通过将最后一行替换为:

来获得相同的效果
for i in nest_search_gen(item):
    yield i

答案 1 :(得分:1)

使用发布hereflatten解决方案,您可以尝试以下内容。

>>> def flatten(x):
    try:
      it = iter(x)
    except TypeError:
      yield x
    else:
      for i in it:
        for j in flatten(i):
          yield j
>>> filter(bool, flatten(test))
[15, 7, 11, 13, 20]

我认为使用两个单独的函数flattenfilter更加清晰,并且您鼓励使用模块化,允许在没有其他函数的情况下使用它们。