【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来创建自己的函数