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 2015-09-15 12:12:20 +08:00
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 像楼上说的一样,我觉得递归跟数学的那个什么数学归纳法差不多,给你一个问题,你能把这个问题分解成更小的子问题,并且问题跟子问题是一样的。编程的时候,你要清楚你这个函数输入输出是什么, 是不是递归调用的时候,是不是写对了输入,再看看子问题输出怎么处理才能得到问题的结果。
|