
from collections import Sequence def flatten (ragged_lst ): ret = [flatten (item ) if isinstance (item, Sequence ) else item for item in ragged_lst] return ret def main (): ragg = [1, [2, 3], 4, [5, [6, 7, [8, 9], 10], 11], 12] print (flatten (ragg )) if __name__ == '__main__': main () 本意是把一个不规则的 list 摊平。关于递归程序,有时候写的是正确的,有时候就不正确。
请教请教
1 exch4nge 2015-09-15 12:11:50 +08:00 我是没看明白,这段程序怎么能弄平 list …… 函数返回值是个 list ,递归也没用啊 |
2 WKPlus flatten 返回的一个 list ,然后递归的时候又把这个返回值作为 list 的元素,所以。。。 |
3 aheadlead 2015-09-15 12:13:57 +08:00 def flatten (ragged_lst ): ret = [] for item in ragged_lst: ret = ret + flatten (item ) if isinstance (item, list ) else ret + [item] return ret |
4 aheadlead 2015-09-15 12:14:28 +08:00 def flatten (ragged_lst ): ret = [] for item in ragged_lst: ret = ret + flatten (item ) if isinstance (item, list ) else ret + [item] return ret |
5 aheadlead 2015-09-15 12:15:14 +08:00 懒得用 gist 抱歉(摊手… |
6 WKPlus 2015-09-15 12:19:48 +08:00 给你找到一个比较优雅的答案: http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python 我是 sof 搬运工:) |
7 9hills 2015-09-15 12:19:58 +08:00 1L 正解: ret = [flatten (item ) if isinstance (item, Sequence ) else item for item in ragged_lst] 这块写错了 |
8 leavic 2015-09-15 14:59:58 +08:00 via iPhone re t 就算只有一个数也成了序列 |
9 yuxizhou 2015-09-15 15:30:49 +08:00 用 generator 的答案好评 |
10 miemiekurisu 2015-09-15 22:47:06 +08:00 ....你如果只是要弄平.... 真心不如一句 str (ragg ).replace ('[','').replace (']','').split (',') |
11 billgreen1 OP |
12 aheadlead 2015-09-19 10:52:28 +08:00 @billgreen1 唔,很小的时候数学启蒙课老师有讲过… |
13 exch4nge 2015-09-20 19:25:25 +08:00 @billgreen1 像楼上说的一样,我觉得递归跟数学的那个什么数学归纳法差不多,给你一个问题,你能把这个问题分解成更小的子问题,并且问题跟子问题是一样的。编程的时候,你要清楚你这个函数输入输出是什么, 是不是递归调用的时候,是不是写对了输入,再看看子问题输出怎么处理才能得到问题的结果。 |