列表生成器 和 生成器表达式

声明式编程风格
列表生成器

将一系列代码封装到一行,以列表的形式输出结果

#用一个列表生成多个值
l = []
for i in range(100):
l.append('%s'%i)
print(l)

l = ['egg%s'%i for i in range(100) if i > 50]
print(l)

#读取文件的绝对路径
import os
g = os.walk('F:\egon')
file_path = []
for i in g:
for j in i[-1]:
file_path.append('%s\%s'%(i[0],j))
print(file_path)

l=['%s\%s'%(i[0],j) for i in g for j in i[-1]]
print(l)

#添加条件
l = [1,2,3,4]
s = 'hello'
l1 = []
for num in l:
for s1 in s:
t = (num ,s1)
l1.append(t)
print(l1)

l2 = [(num,s1) for num in l for s1 in s if num > 2]
print(l2)


#生成器表达式
# #有时候程序的运行结果一个列表装不下,内存不够用,所以讲运行结果返回为一个生成器,一次返回一个结果
import os
g = os.walk('F:\')
l=('%s\%s'%(i[0],j) for i in g for j in i[-1])
print(next(l))
print(type(l)) #l为生成器

#求文件中商品总价
money= []
with open('a.txt') as f:
for line in f:
goods = line.split() #每一行变成列表
money.append(float(goods[1])*float(goods[2]))
print(sum(money))

with open('a.txt') as f:
l=(float(line.split()[1])*float(line.split()[2]) for line in f)
print(sum(l)) #sum 可以对可迭代对象求和 内置了iter next函数,将可迭代对象变为迭代器再执行next函数

#求文件中的每行变为一个字典放入一个列表中
res = []
with open('a.txt') as f:
for line in f:
l = line.split()
d ={}
d['name'] = l[0]
d['price'] = l[1]
d['count'] = l[2]
res.append(d)
print(res)



with open('a.txt') as f:
res = (line.split() for line in f) #生成器表达式返回了一个 可以返回字符串内容的 生成器
dic_g = ({'name':i[0],'price':i[1],'count':i[2]} for i in res ) #返回字典内容的生成器
apple_dic = next(dic_g)
print(apple_dic['count'])

with open('a.txt') as f:
res = (line.split() for line in f)
dic_g = ({'name':i[0],'price':i[1],'count':i[2]} for i in res if float(i[1]) > 10000)
for j in dic_g:
print(j)



应用
linux=['钢弹','小壁虎','小虎比','alex','wupeiqi','yuanhao']
python=['dragon','钢弹','zhejiangF4','小虎比']
#问题一:得出既报名linux又报名python的学生列表
l1 = []
for i in linux:
for j in python:
if i == j:
l1.append(i)
print(l1)

l1 = [ i for i in linux for j in python if i == j]
print(l1)
#问题二:得出只报名linux,而没有报名python的学生列表
l2 = []
for i in linux:
if i not in python:
l2.append(i)
print(l2)
l2 = [i for i in linux if i not in python]
#问题三:得出只报名python,而没有报名linux的学生列表
l3 = []
for i in python:
if i not in linux:
l3.append(i)
print(l3)

l3 = [i for i in python if i not in linux]


shares={
'IBM':36.6,
'lenovo':27.3,
'huawei':40.3,
'oldboy':3.2,
'ocean':20.1
}

#问题一:得出股票价格大于30的股票名字列表

l = [i for i in shares if float(shares[i]) > 30]
print(l)
#问题二:求出所有股票的总价格
l =sum([shares[i] for i in shares])
print(l)

l=[10,2,3,4,5,6,7]
#得到一个新列表l1,新列表中每个元素是l中对应每个元素值的平方
l = [i**2 for i in l]
print(l)
#过滤出l1中大于40的值,然后求和
l = sum([i for i in l if i >40])
print(l)


原文地址:https://www.cnblogs.com/liuguniang/p/6714956.html