补充 推导式

推导式是从一个或者多个迭代器快速简洁地创建数据结构的一种方法。它可以将循环和条件判断结合,从而避免语法冗长的代码。会使用推导式有时可以说明你已经超过Python 初学者的水平。也就是说,使用推导式更像Python风格

1. 列表推导式

数据准备:读入income.csv的数据,并存储到二维列表中:

import csv
csvFile = open('Documents/income.csv')
csvReader = csv.reader(csvFile)
incomeList = list(csvReader)
print(incomeList)
---------------------------------------------------------------------
[['编号', '姓名', '基本工资', '奖金', '住房补助', '五险一金', '其他扣款', '专项附加扣除'], ['10932', '张珊', '15000.00 ', '4000.00 ', '2300.00 ', '980.00 ', '300.00 ', '1000.00'], ['10933', '李思', '12000.00 ', '5000.00 ', '2600.00 ', '890.00 ', '400.00 ', '2000.00'], ['10934', '王武', '10100.00 ', '2000.00 ', '2500.00 ', '860.00 ', '500.00 ', '1500.00'], ['10935', '赵柳', '10050.00 ', '1000.00 ', '2700.00 ', '1080.00 ', '300.00 ', '2000.00'], ['10936', '钱棋', '10200.00 ', '2000.00 ', '2400.00 ', '1000.00 ', '600.00 ', '1000.00'], ['10941', '张明', '13600.00 ', '4000.00 ', '2100.00 ', '680.00 ', '300.00 ', '1000.00'], ['10942', '赵敏', '13200.00 ', '2500.00 ', '2300.00 ', '670.00 ', '400.00 ', '3000.00'], ['10945', '王红', '13600.00 ', '2600.00 ', '2030.00 ', '560.00 ', '400.00 ', '2000.00'], ['10946', '李萧', '12500.00 ', '2800.00 ', '2400.00 ', '420.00 ', '500.00 ', '1500.00'], ['10947', '孙科', '12000.00 ', '3500.00 ', '2030.00 ', '880.00 ', '300.00 ', '1000.00'], ['10948', '刘利', '14200.00 ', '2500.00 ', '2020.00 ', '900.00 ', '400.00 ', '2000.00']]
incomeList = incomeList[1:]  #去掉第一行(标题行)

利用循环获得基本工资的最大值:

salaryList = []
for income in incomeList:
    salaryList.append(income[2])
max(salaryList)
---------------------------------------------------------------------
'15000.00 '

利用列表推导式,可以更简单:

max([x[2] for x in incomeList])
---------------------------------------------------------------------
'15000.00 '

更像Python 风格的创建列表方式是使用列表推导。最简单的形式如下所示:

[ expression for item in iterable ]

下面的例子将通过列表推导创建一个整数列表:
其中第一个number也可以为表达式,试试下面改编的例子:

number_list = [number for number in range(1,6)]
number_list
---------------------------------------------------------------------
[1, 2, 3, 4, 5]
---------------------------------------------------------------------
number_list = [number ** 2 for number in range(1,6)]
number_list
---------------------------------------------------------------------
[1, 4, 9, 16, 25]

列表推导把循环放在方括号内部。这种例子和之前碰到的不大一样,但却是更为常见的方式。同样,列表推导也可以像下面的例子加上条件表达式

[expression for item in iterable if condition]

现在,通过推导创建一个在1到20之间的偶数列表(当number % 2 为真时,代表奇数;为假时,代表偶数):

a_list = [number for number in range(1,21) if number % 2 == 1]
a_list
---------------------------------------------------------------------
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

练习:计算基本工资大于12000的人平均扣款

sum([float(x[5]) + float(x[6]) + float(x[7]) for x in incomeList if float(x[2]) > 12000])/len(incomeList)
---------------------------------------------------------------------
1546.3636363636363

最后,正如存在很多嵌套循环一样,在对应的推导中会有多个for … 语句。我们先来看一个简单的嵌套循环的例子,并在屏幕上打印出结果:

for row in range(len(incomeList)):
    for col in range(len(incomeList[row])):
        print(incomeList[row][col], end=" ")
    print()
---------------------------------------------------------------------
10932 张珊 15000.00  4000.00  2300.00  980.00  300.00  1000.00 
10933 李思 12000.00  5000.00  2600.00  890.00  400.00  2000.00 
10934 王武 10100.00  2000.00  2500.00  860.00  500.00  1500.00 
10935 赵柳 10050.00  1000.00  2700.00  1080.00  300.00  2000.00 
10936 钱棋 10200.00  2000.00  2400.00  1000.00  600.00  1000.00 
10941 张明 13600.00  4000.00  2100.00  680.00  300.00  1000.00 
10942 赵敏 13200.00  2500.00  2300.00  670.00  400.00  3000.00 
10945 王红 13600.00  2600.00  2030.00  560.00  400.00  2000.00 
10946 李萧 12500.00  2800.00  2400.00  420.00  500.00  1500.00 
10947 孙科 12000.00  3500.00  2030.00  880.00  300.00  1000.00 
10948 刘利 14200.00  2500.00  2020.00  900.00  400.00  2000.00 
cells = [(row, col) for row in range(len(incomeList)) for col in range(len(incomeList[0]))]
for row, col in cells:
    if col == 0:     #输出另一位员工信息时,输出换行
        print()
    print(incomeList[row][col], end=" ")
---------------------------------------------------------------------

10932 张珊 15000.00  4000.00  2300.00  980.00  300.00  1000.00 
10933 李思 12000.00  5000.00  2600.00  890.00  400.00  2000.00 
10934 王武 10100.00  2000.00  2500.00  860.00  500.00  1500.00 
10935 赵柳 10050.00  1000.00  2700.00  1080.00  300.00  2000.00 
10936 钱棋 10200.00  2000.00  2400.00  1000.00  600.00  1000.00 
10941 张明 13600.00  4000.00  2100.00  680.00  300.00  1000.00 
10942 赵敏 13200.00  2500.00  2300.00  670.00  400.00  3000.00 
10945 王红 13600.00  2600.00  2030.00  560.00  400.00  2000.00 
10946 李萧 12500.00  2800.00  2400.00  420.00  500.00  1500.00 
10947 孙科 12000.00  3500.00  2030.00  880.00  300.00  1000.00 
10948 刘利 14200.00  2500.00  2020.00  900.00  400.00  2000.00 

既有if语句又有for嵌套的列表推导式:

列表推导式可以带任意数量的嵌套 for 循环,并且每一个 for 循环后面都有可选的 if 语句。

通用语法:

[ expression for x in X [if condition]
             for y in Y [if condition]
             ...
             for n in N [if condition] ]

例如,下面的代码输出了0~4之间的偶数和奇数的组合。

[(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
---------------------------------------------------------------------
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

等价于下面的一般 for 循环:

L = []
for x in range(5):
    if x % 2 == 0:
        for y in range(5):
            if y % 2 == 1:
                L.append((x, y))
L
---------------------------------------------------------------------
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

列表推导式生成矩阵

生成矩阵的方式有多种,例如手动赋值、一般for循环,还有就是列表推导式。如果我们要用列表推导式生成下面的矩阵,可以怎么写?
M = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
一种方法是:

M = [[x, x+1, x+2] for x in [1, 4, 7]]
M
---------------------------------------------------------------------
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

矩阵的列数少时可以使用这种方法。

如果矩阵的列数较多,我们可以使用另外一种方式:在循环变量的表达式中使用列表推导式。

具体代码如下:

M = [[y for y in range(x, x+3)] for x in [1, 4, 7]]
M
---------------------------------------------------------------------
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

2. 字典推导式

除了列表,字典也有自己的推导式。最简单的例子就像:

{ key_expression : value_expression for expression in iterable }

例如,统计语句"Stay hungry, Stay foolish."中字符出现的个数:

sentence = "Stay hungry, Stay foolish."
letter_counts = {}
for letter in sentence:
    letter_counts[letter] = letter_counts.get(letter, 0) + 1     
    #.get()方法,存在取其值,不存在新建并令其值为0
print(letter_counts)
---------------------------------------------------------------------
{'S': 2, 't': 2, 'a': 2, 'y': 3, ' ': 3, 'h': 2, 'u': 1, 'n': 1, 'g': 1, 'r': 1, ',': 1, 'f': 1, 'o': 2, 'l': 1, 'i': 1, 's': 1, '.': 1}

如果只统计字母出现的次数:

sentence = "Stay hungry, Stay foolish."
letter_counts = {}
for letter in sentence:
    if 'a' <= letter <= 'z' or 'A' <= letter <= 'Z':
        letter_counts[letter] = letter_counts.get(letter, 0) + 1
print(letter_counts)
---------------------------------------------------------------------
{'S': 2, 't': 2, 'a': 2, 'y': 3, 'h': 2, 'u': 1, 'n': 1, 'g': 1, 'r': 1, 'f': 1, 'o': 2, 'l': 1, 'i': 1, 's': 1}

使用字典推导式

sentence = "Stay hungry, Stay foolish."
letter_counts = {letter: sentence.count(letter) for letter in sentence}
print(letter_counts)
---------------------------------------------------------------------
{'S': 2, 't': 2, 'a': 2, 'y': 3, ' ': 3, 'h': 2, 'u': 1, 'n': 1, 'g': 1, 'r': 1, ',': 1, 'f': 1, 'o': 2, 'l': 1, 'i': 1, 's': 1, '.': 1}

练习:快速交换字典的key,value

myDic = {'a': 100, 'b': 300}
myDic_switch = {v: k for k, v in myDic.items()}
print(myDic_switch)
---------------------------------------------------------------------
{100: 'a', 300: 'b'}

3. 集合推导式

集合也不例外,同样有推导式。最简单的版本和之前的列表、字典推导类似:

{expression for expression in iterable }

a_set = {number for number in range(1,6) if number % 3 == 1}
a_set
---------------------------------------------------------------------
{1, 4}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值