初探Python列表生成式
在Python开发过程中,我们经常会遇到对数据进行一定的处理并生成一个列表的需求。例如一个最简单的需求:产生一个元素为0 – 9的列表,这个需求可以说是再简单不过了,一个for循环遍历range(10)依次添加到列表中即可:
上述代码的输出结果就是一个我们需要的元素为0-9的列表了。
代码看起来还算比较简单,结构上也不复杂,但是还有没有更简便的写法呢?答案当然是有的了!现在就让我们来使用Python的列表生成式语法对上述代码进行优化:
核心代码其实只有一行,借助列表生成式语法我们成功的将三行的代码缩减到了一行,这还是针对最简单的情况,在复杂情况下代码精简的效果会更加直观。
我们来看看输出结果对不对,上述使用列表生成式语法的输出结果为:
输出结果来看是我们需要的元素为0-9的列表,我们来详细分析一下这段使用列表生成式语法的代码:
my_list就是我们定义的用来存储0-9元素的列表,不同的是,一般定义列表变量的方法是my_list = []。上述代码却在这对中括号里塞下了一长串代码,仔细分析的话,会发现这是一串用来描述for循环的代码。其中的for index in range(10)就是在我们之前的代码中用来生成这样一个列表所使用的for循坏,而在这个循环的前面,就是循环过程中迭代的变量index。
这就是列表生成式语法最基本的样子:需要生成的元素放在最前面,后面跟for循环,这样程序就知道,要在这个循环迭代的过程中,将所需的元素依次放入数组中,最后构建出我们需要的数组。
列表生成式进阶
我们上面的例子还是太过简单了,在实际的开发中需求会复杂许多,那么如何用列表生成式语法来处理更为复杂的情况呢?实际上列表生成式在实际使用中的功能十分强大,例如我们希望得到一个元素为0×2, 1×2, 2×2, …, 9×2的列表就可以这样实现:
将上述代码生成的my_list打印出来可以得到下面的输出:
只需要将生成的元素×2就可以得到我们需要的列表了。除了对所生成的元素进行数值处理外,我们还可以借助函数对其进行更为复杂的操作,例如通过str的lower()函数我们可以将一个数组中所有的字符串都变成小写:
将生成的lower_list打印出来,可以看到old_list里的四个单词都被变成了小写:
除了对生成的元素进行处理外,列表生成式还可以增加if判断,用来筛选所需的元素。例如我们希望得到0-10中为偶数的元素组成的列表,那么只需要在for循环的后面增加上index % 2 == 0的判断对迭代的元素进行过滤即可:
输出经过index % 2 == 0条件过滤得到的数组可以看到构成元素都是我们期望的偶数:
我们可以使用for循环来同时处理多个变量,同样的使用列表生成式也可以一次性处理多个变量。例如我们有一个数组,内部元素为一个个的元祖,每个元祖中存储了一个学生的语数英三科的成绩,我们希望得到这一个新的列表,记录每个学生的平均分,那么我们可以通过列表生成式这样实现:
输出上述代码计算得到的平均分列表aves,验证一下是不是我们要的结果:
对grades遍历得到的是一个个的元祖,我们可以指定与元组长度相等的若干个变量来分别接收元祖内的每一个元素,例如上例在for循环中使用cn、math、en三个变量来分别接收元组内的语文、数学、英语成绩。要得到三科的平均分,只需要将这三个变量相加,然后再除以3即可,其中round函数可以用来限定Python浮点型数值的小数点位数。
至此我们已经初步掌握了Python的列表生成式语法,可以使用它来精简和优化一些简单的列表生成代码。