四、python的推导式
1、 列表推导式
列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
1.1格式
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:
复制代码代码如下:
result = []
for value in collection:
if condition:
result.append(expression)
#平方列表 #列表推导 print('0-9的平方列表(推导):', [x**2 for x in range(10)]) #for循环 list = [] for x in range(10): list.append(x**2) print('0-9的平方列表', list) print('------------------------------') #偶数的平方列表 #列表推导 print('0-9偶数的平方列表(推导):', [x**2 for x in range(10) if x%2 == 0]) #for循环 list1=[] for x in range(10): if x%2 == 0: list1.append(x**2) print('0-9偶数的平方列表:', list1) print('---------------------------------') #立方列表的奇数 #列表推导 print('0-9立方的奇数列表(推导):', [x**2 for x in range(10) if x**2 % 2 != 0] ) #for循环 list2 = [] for x in range(10): if x**2 % 2 !=0: list2.append(x**2) print('0-9立方的奇数列表:', list2) print('--------------------------------') #找出质数 #一般方法 compositeNumber = [] num = [] #合数一般都是2-7的倍数 for i in range(2,8): #4是最小的合数,找出50以内的所有合数 for j in range(2*i, 50, i): compositeNumber.append(j) for x in range(3,50): if x not in compositeNumber: num.append(x) print('2-50内的质数:',num) #用推导 compositeNumber = [j for i in range(2,8) for j in range(i*2,50,i)] num = [x for x in range(3,50) if x not in compositeNumber] print('2-50内的质数(推导):',num) #列表推导之间的嵌套 num = [x for x in range(3,50) if x not in [j for i in range(2,8) for j in range(i*2,50,i)]] print('2-50内的质数(嵌套列表推导):',num)
结果:
0-9的平方列表(推导): [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0-9的平方列表 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
------------------------------
0-9偶数的平方列表(推导): [0, 4, 16, 36, 64]
0-9偶数的平方列表: [0, 4, 16, 36, 64]
---------------------------------
0-9立方的奇数列表(推导): [1, 9, 25, 49, 81]
0-9立方的奇数列表: [1, 9, 25, 49, 81]
--------------------------------
2-50内的质数: [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
2-50内的质数(推导): [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
2-50内的质数(嵌套列表推导): [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
从代码和结果中可以看出,用列表推导式可以用少量的代码来实现同样的结果。
列表推导式之间也可以嵌套。
#列表和列表之间进行嵌套 list1 = [[x,y] for x in range(4) for y in range(5) if y % 2 ==0] print(list1) #列表里面嵌套元组 list2 = [(x, y) for x in range(4) if x % 2 ==0 for y in range(5) ] print(list2)
结果:
[[0, 0], [0, 2], [0, 4], [1, 0], [1, 2], [1, 4], [2, 0], [2, 2], [2, 4], [3, 0], [3, 2], [3, 4]]
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]
元组就没有推导式,但是不会报错。
tuple1 = (x**2 for x in range(10)) print('0-9的平方元组(推导):', tuple1)
结果:
0-9的平方元组(推导): <generator object <genexpr> at 0x004B9F00>
1.2字典推导式
字典和集合推导式是上面思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:
{ key_expr: value_expr for value in collection if condition }
字符串用到字典推导:
str = 'sderfsdffsdfdsa' #用字典推导式 dictionary = {key : val for key,val in enumerate(str)} print(dictionary) #用普通方式 index = 0 for x in str: print(index,':',x,end=',') index+=1 print() #用enumrate遍历 print('---------------------------',end='\n') for index,value in enumerate(str): print(index,':',value,end=',')
结果:
{0: 's', 1: 'd', 2: 'e', 3: 'r', 4: 'f', 5: 's', 6: 'd', 7: 'f', 8: 'f', 9: 's', 10: 'd', 11: 'f', 12: 'd', 13: 's', 14: 'a'}
0 : s,1 : d,2 : e,3 : r,4 : f,5 : s,6 : d,7 : f,8 : f,9 : s,10 : d,11 : f,12 : d,13 : s,14 : a,
---------------------------
0 : s,1 : d,2 : e,3 : r,4 : f,5 : s,6 : d,7 : f,8 : f,9 : s,10 : d,11 : f,12 : d,13 : s,14 : a,
#列表 list = ['hello','world','python','2017-8-7',123] #索引从1开始计数,默认从0开始计数 dictionary ={index : val for index,val in enumerate(list,1) } print(dictionary) #元组 tuple = (1,2,3,4,'ok','hello','world','python','2017-8-7') #索引从3开始计数 dic = {index : val for index,val in enumerate(tuple,3)} print(dic)
结果
{1: 'hello', 2: 'world', 3: 'python', 4: '2017-8-7', 5: 123}
{3: 1, 4: 2, 5: 3, 6: 4, 7: 'ok', 8: 'hello', 9: 'world', 10: 'python', 11: '2017-8-7'}
1.3 集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:
{ expr for value in collection if condition }
用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception'] print({len(s) for s in strings}) #有长度相同的会只留一个,这在实际上也非常
结果
{1, 2, 4, 9}
2、 python enumerate用法
- enumerate()是python的内置函数
- enumerate在字典上是枚举、列举的意思
- 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
- enumerate多用于在for循环中得到计数
python文档中是这么说的:
enumerate(sequence, [start=0])
Return an enumerate object. sequence must be a sequence, an iterator, or some other object which sup-
ports iteration. The next() method of the iterator returned by enumerate() returns a tuple containing
a count (from start which defaults to 0) and the corresponding value obtained from iterating over iter-
able. enumerate() is useful for obtaining an indexed series: (0, seq[0]), (1, seq[1]), (2,
seq[2]), ....
For example:
>>> for i, season in enumerate([’Spring’, ’Summer’, ’Fall’, ’Winter’]):
...
print i, season
0 Spring
1 Summer
2 Fall
3 Winter
如果要统计文件的行数,可以这样写:
count = len(open(filepath, 'r').readlines())
- 1
- 1
这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。
可以利用enumerate():
count = -1
for index, line in enumerate(open(filepath,'r')):
count += 1
注意:字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版).