我有一个嵌套列表,例如:
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]
答案 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)
使用发布here的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]
我认为使用两个单独的函数flatten
和filter
更加清晰,并且您鼓励使用模块化,允许在没有其他函数的情况下使用它们。