3 回答

TA貢獻1827條經驗 獲得超4個贊
這是一種字符串友好的遞歸方法:
nests = [1, 2, [3, 4, [5],['hi']], [6, [[[7, 'hello']]]]]
def flatten(container):
for i in container:
if isinstance(i, (list,tuple)):
for j in flatten(i):
yield j
else:
yield i
print list(flatten(nests))
返回:
[1, 2, 3, 4, 5, 'hi', 6, 7, 'hello']
請注意,這并不能保證速度或開銷的使用,但是說明了一種遞歸解決方案,希望會對您有所幫助。

TA貢獻1865條經驗 獲得超7個贊
此函數應該能夠快速平整嵌套的可迭代容器,而無需使用任何遞歸:
import collections
def flatten(iterable):
iterator = iter(iterable)
array, stack = collections.deque(), collections.deque()
while True:
try:
value = next(iterator)
except StopIteration:
if not stack:
return tuple(array)
iterator = stack.pop()
else:
if not isinstance(value, str) \
and isinstance(value, collections.Iterable):
stack.append(iterator)
iterator = iter(value)
else:
array.append(value)
大約五年后,我對此事的看法發生了變化,使用它可能會更好:
def main():
data = [1, 2, [3, 4, [5], []], [6]]
print(list(flatten(data)))
def flatten(iterable):
iterator, sentinel, stack = iter(iterable), object(), []
while True:
value = next(iterator, sentinel)
if value is sentinel:
if not stack:
break
iterator = stack.pop()
elif isinstance(value, str):
yield value
else:
try:
new_iterator = iter(value)
except TypeError:
yield value
else:
stack.append(iterator)
iterator = new_iterator
if __name__ == '__main__':
main()
添加回答
舉報