您的位置:首页 > 编程语言 > Python开发

【head First python】之递归处理嵌套列表

2013-09-10 15:57 531 查看
【head First python】之递归处理嵌套列表
通常我们将数据储存在列表中,然后使用for循环去处理。(当然,在需要额外控制的情况下可以使用while)
Demo:
movies = ["托尼",1975,"杰克",91,"唐老鸭","机器猫"]
for i in movies:
print i
上面的for可以很正常的处理列表,但是。如果列表是多维列表还能如上正常处理吗?
Demo:
movies = ["托尼",1975,"杰克",91,"唐老鸭",["机器猫","机器狗"]]
for i in movies:
print i
经过测试,可以知道单纯的使用for无法正确的得到我们想要的结果,不过这并不是for循环的问题,而是我们并没有告诉for该如何处理找到的内列表,对于for循环来说,内列表只是外列表中的一个列表项而已,所以我们要让for知道内列表也要当做列表处理!!

那么这里我们可以使用python内置函数isinstance(),这个函数可以检测特定的标识符是否包含某个特定类型的数据!
Demo:
>>> the_list = ['aa','bb']
>>> isinstance(the_list,list)
True
>>> a = 'b'
>>> isinstance(a,list)
False
这个函数是不是很酷?检测为列表返回True否则为False

那么,就让我们更新一下代码
Demo:

movies = ["托尼",1975,"杰克",91,"唐老鸭",["机器猫","机器狗"]]
for list_wai in movies:
if isinstance(list_wai,list):  #判断当前循环取值是否为列表
for list_nei in list_wai: #上面判断为列表则运行该for处理这个内列表
print(list_nei)  #打印处理好的内列表数据
else:
print(list_wai)    #判断不为列表的项则直接打印出来
上面的代码很好的处理了内列表的数据,但是如果内列表中还有一个内列表,甚至是N个内列表,上面这段代码可能就有点力不从心了!所以,现在该创建一个函数,使用递归!

Demo:
movies = ["托尼",1975,"杰克",91,"唐老鸭",["机器猫","机器狗",['我是内内列表',['我是内内内列表']]]]
def print_list(the_list): #定义一个名为print_list的函数,带有名为the_list的形参
for list_wai in the_list: #使用for处理这个形参
if isinstance(list_wai,list): #如果当前列表项为内列表则在下面继续调用这个函数!
print_list(list_wai)
else:
print(list_wai)#如果列表项不为内列表,则直接打印这个列表项

print_list(movies)#运行这个函数,并带入通过形参带入列表
当然,我们可以进一步将这个函数定义为一个模块,上传至PyPI上与这个世界上所有的python爱好者分享!

小节:
一:isinstance()内置函数会检查一个标识符是否制定某个指定类型的数据对象。
二:使用def来创建自己的函数

本文出自 “盛夏光年” 博客,请务必保留此出处http://mayday.blog.51cto.com/5166623/1293773
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: