Python列表推导式用法

四、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以上版).

猜你喜欢

转载自blog.csdn.net/zhangbaoanhadoop/article/details/81634780