6.6 数据结构的一些技巧

    多重循环

    有很多函数的用法和数据结构的使用是息息相关的。前面我们学习了列表的基本用法,而在实际操作中往往会遇到更多的问题。比如,在整理表格或者文件的时候会按照字母或者日期进行排序,在 Python 中也存在类似的功能:

    num_list = [6,2,7,4,1,3,5]
    print(sorted(num_list))

    怎么样,很神奇吧?sorted 函数按照长短、大小、英文字母的顺序给每个列表中的元素进行排序。这个函数会经常在数据的展示中使用,其中有一个非常重要的地方,sorted 函数并不会改变列表本身,你可以把它理解成是先将列表进行复制,然后再进行顺序的整理。

    在使用默认参数 reverse 后列表可以被按照逆序整理:

    sorted(num_list,reverse=True)

    在整理列表的过程中,如果同时需要两个列表应该怎么办?这时候就可以用到 zip 函数,比如:

    for a,b in zip(num,str):
    print(b,'is',a)

    6.6 数据结构的一些技巧 - 图1

    推导式

    现在我们来看数据结构中的推导式(List comprehension),也许你还看到过它的另一种名称叫做列表的解析式,在这里你只需要知道这两个说的其实是一个东西就可以了。

    现在我有10个元素要装进列表中,普通的写法是这样的:

    a = []
    for i in range(1,11):
    a.append(i)

    下面换成列表解析的方式来写:

    b = [i for i in range(1,11)]

    列表解析式不仅非常方便,并且在执行效率上要远远胜过前者,我们把两种不同的列表操作方式所耗费的时间进行对比,就不难发现其效率的巨大差异:

    import time

    a = []
    t0 = time.clock()
    for i in range(1,20000):
    a.append(i)
    print(time.clock() - t0, seconds process time")

    t0 = time.clock()
    b = [i for i in range(1,20000)]
    print(time.clock() - t0, seconds process time")

    得到结果:

    8.999999999998592e-06 seconds process time
    0.0012320000000000005 seconds process time

    列表推导式的用法也很好理解,可以简单地看成两部分。红色虚线后面的是我们熟悉的 for 循环的表达式,而虚线前面的可以认为是我们想要放在列表中的元素,在这个例子中放在列表中的元素即是后面循环的元素本身。

    6.6 数据结构的一些技巧 - 图2

    为了更好地理解这句话,我们继续看几个例子:

    a = [i**2 for i in range(1,10)]
    c = [j+1 for j in range(1,10)]
    k = [n for n in range(1,10) if n % 2 ==0]
    z = [letter.lower() for letter in 'ABCDEFGHIGKLMN']

    字典推导式的方式略有不同,主要是因为创建字典必须满足键-值的两个条件才能达成:

    d = {i:i+1 for i in range(4)}

    g = {i:j for i,j in zip(range(1,6),'abcde')}
    g = {i:j.upper() for i,j in zip(range(1,6),'abcde')}

    循环列表时获取元素的索引

    现在我们有一个字母表,如何能像图中一样,在索引的时候得到每个元素的具体位置的展示呢?

    letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    a is 1
    b is 2
    c is 3
    d is 4
    e is 5
    f is 6
    g is 7

    前面提到过,列表是有序的,这时候我们可以使用 Python 中独有的函数 enumerate 来进行:

    letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    for num,letter in enumerate(letters):
    print(letter,'is',num + 1)