[转载] python补充知识点-----列表和列表推导式(2)

此文为转载文章,原博见:https://blog.csdn.net/zhangbaoanhadoop/article/details/81634780 ,侵删。
1.python的推导式
1、 列表推导式
列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。

1.1格式
[表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件]过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:

result = []  
for value in collection:  
    if condition:  
        result.append(expression)  

 下面是一些for循环和列表推导式的对比举例:

'''===================计算平方列表==================='''
#使用列表推导
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)

运行结果:

从代码和结果中可以看出,用列表推导式可以用少量的代码来实现同样的结果。

列表推导式之间也可以嵌套:

#列表和列表之间进行嵌套
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)

运行结果:

元组没有推导式,但是不会报错。

tuple1 = (x**2 for x in range(10))
print('0-9的平方元组(推导):', tuple1)

运行结果:

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=',')

运行结果:

#列表
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.3 集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

{ expr for value in collection if condition }

用集合推导建字符串长度的集合

strings = ['a','is','with','if','file','exception']
print({len(s) for s in strings}) #有长度相同的会只留一个

运行结果:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值