0

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

 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]
4

2 回答 2

2

我看到的唯一不符合pythonic的是默认参数。请参阅此问题,了解为什么这不会按您的预期方式工作。

这是我要解决的方法:

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)

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

for i in nest_search_gen(item):
    yield i
于 2012-11-23T03:54:45.390 回答
1

使用此处flatten发布的解决方案,您可以尝试以下方法。

>>> 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清晰,并且您鼓励模块化,允许一个在没有另一个的情况下使用。

于 2012-11-23T03:58:14.290 回答