Python 轻松学会写程式笔记-第4节57-[微进阶]list comprehensive(清单快写法)

最终程序

data = []
with open('reviews.txt', 'r') as f:
	for line in f:
		data.append(line)

new = []
for d in data:
	if len(d) < 100:
		new.append(d)
print('一共有', len(new), '笔留言长度小于100')
print(new[0])
print(new[1])

# good = []
# for d in data:
# 	if 'good' in d:
# 		good.append(d)
# print('一共有', len(good), '笔留言中含有good')

good = [d for d in data if 'good' in d]
print(good)

bad = ['bad' in d for d in data]
print(bad)

bad = []
for d in data:
	bad.append('bad' in d)

在这里插入图片描述

解释写法

复习

good = []
for d in data:
	if 'good' in d:
		good.append(d)
print('一共有', len(good), '笔留言中含有good')

好 我们再看一次刚刚的筛选
先用一个for loop来读取这个data 一笔一笔交出来 每一笔我称为d
如果good在d裡面 我就把你装进good清单嘛
所以这是某种筛选嘛 从一百万笔的清单裡面 我们筛选过后 剩下两万嘛
从一大池变得比较小池 这是某种筛选
我们写了四行

那我现在要来介绍一种快写法
可以做到这种筛选 而且只需要写一行
如果没办法完全体会这个部分 可以用原本四行的作法来做
如果你想要学的比较进阶的人 你可以听一下这一段
我介绍这个快写法 因为它真的很方便

我直接把他打出来

good = [d for d in data if 'good' in d]

这一行的筛选 完全等于上面这四行的筛选
就是把留言裡面有提到good的都筛选出来 变成一个新的清单

那我说过这个快写法 它是比较进阶的 所以初学者如果你现在不想接触这个 比较进阶的内容 你可以跳过没关係
这个快写法
前面有一个清单的符号 后面也有清单的符号

output = [(number-1) for number in reference if number % 2 == 0]
# output = [(运算) for 变数 in 清单 if 筛选条件]

第一行:
good = []
开头跟结尾嘛
所以它是产生一个清单没错
它是list

第二行:
for d in data:
我们看看 四行有一个for loop:For d in data
快写法也有for d in data
For d in data就是把一百万笔的留言一个一个交出来 然后每一个称为d
这个for loop是一定要有的 我们才可以一笔一笔存取资料

第三行:
if ‘good’ in d:
那后面这边有一个筛选的条件
If ‘good’ in d 原本也有嘛
所以这两行 根本就跟原本的一模一样 我们只是写在同一行而已
所以我就说它为什么是快写法 它也没有省略什么东西 没有省略太多啦 有省略啦
这个部分跟原本的概念是一模一样的
筛选不一定要有

第四行:
good.append(d)
【我自己的理解是把第四行提到最前面去 省略为一个d】
前面这个d最难解释
为什么我们这个清单的符号 前面有这个d 这个d就是第四行的d
For d in data就是数据中的每一笔数据出来
你想像成一个同学出来 我问这个人说 Good有没有在你裡面 如果有你就进来我们的队伍 你就进来我们的清单 我就把你装进去 我就把d 就这个人 这个留言 装进去good裡面
来下一个同学 也就是for loop的第二回了 Good有没有在你裡面 如果有 我就append进去我们的good清单裡面
所以这个d原本的这边的这个d就是把我们把留言装进我们的队伍
就是这边的意思 原封不动的把这个留言装进队伍

那其实我可以不要原封不动

装1进队伍

我可以装别的东西进我的队伍
例如我现在把程式码改掉 如果这个d我涂掉 改成整数1
那这一段程式码变成什么意思
每一个留言出来 Good有没有在你裡面 如果有 我就把1装进我们的队伍 所以我没有把这个留言装进我的队伍了
下一个留言 Good有没有在你裡面 如果有 如果说有 那我就把1装进我们的队伍 我变成都装1了
所以我的这个新的队伍会变成一堆1 两万多个1 因为有两万多个留言有提到good嘛
所以我的这个新的队伍呢 也就是这个good清单呢 裡面会装著两万多个1 整数1
那这种情况就不是我们原封不动的把它装进清单

这个地方就是模糊的点 有没有
我们有时候可能不见得是想要装原封不动的把它装进来喔 我有可能想要装1喔 或者想要装一些布林值喔true喔 或什么之类的

good = [1 for d in data if 'good' in d]

执行

下面这一段程式码我先把它注解掉
== 选中要注解掉的所有内容然后command+/就可以批量注解==

# good = []
# for d in data:
# 	if 'good' in d:
# 		good.append(d)
# print('一共有', len(good), '笔留言中含有good')

我们现在就验证一下这个快写法
满满的整数1 有没有

如果我要把留言原封不动的装进我这个筛选过后的队伍 我就会写d
data中的每一个d
我把你留下

data中的每一个d 就是每一个留言的代号嘛的名称嘛 我把你原封不动的留一下
这就是前面写这个d的意思
那如果我不要原封不动 我可以装别的东西啊
我也可以 譬如说d加上123 每一个留言的最后 我都把你乱加 加一个123在尾巴

good = [d + '123' for d in data if 'good' in d]

好那我现在再用这个快写法
来写另外一个例子
可能对你来说又是一次大开眼界喔

装运算结果(‘bad’ in d)进清单

我们刚刚都是处理good的嘛 如果你的留言有提到good 我就把你留下对不对
我们刚有讲说这个筛选 不见得要有的

bad = ['bad' in d for d in data]
print(bad)

我现在写一个没有的 bad
for d in data 我后面不要if了 我不要做筛选 所以我这个bad清单会有一百万笔

前面这边我要填一个东西嘛
如果我要原封不动的留下来 那个留言的话我是不是就是写d嘛
如果我要把它全部变成1 我就写1嘛

那现在我写一个运算 我在这个位置放一个运算 是你从来没看过的
例如说 我写一个bad in d
Bad in d是一个运算
这个部分会运算成true或是false
因为它是一个是非题嘛

bad有没有在d裡面 如果有就变true 如果没有就变false
你现在有没有一点想像了
这个bad清单会有一百万笔数据 你要每一笔要么是true 要么是false

执行

来确定它真的是一大堆true或false
如果那个留言裡面呢 有提到bad就会是true
如果留言裡面没有提到bad 就会是false嘛

有没有 狂印false 因为都没有提到bad啊 我们找看看有没有true的 这边有一个true的 所以看起来很少留言提到bad嘛

这个又是另外一种做法 以现在这个快写法的例子 我们没有做筛选对不对 所以会有一百万笔 因为后面没有if嘛没有做筛选
你要每一笔我就问你说 bad有没有在你裡面 如果有我就不就把true留下来 没有我就把false留下来 所以它裡面都装true或false

我们如果用原本的
这种写法来写

bad = []
for d in data:
	bad.append('bad' in d)

第二行:For 一样是for loop嘛 for d in data
没有第三行:然后呢我们没有要筛选 没有要if 所以就直接把它装进清单
第一行:那我先把清单建立出来 这个清单内容bad 刚开始是空清单嘛
第三行:Bad.append() 每一个留言出来 我要把什么东西加进bad清单 我要把这个运算结果加进去啊 这边会运算成true或false

那这种(1 for d和‘bad’ in d for d)没有很常用除非你是在做比较进阶的数据处理
通常我们写这种快写法
List comprehension这种快写法
我们都是前面都是放d比较多
就是只放d原封不动的把那个数据留下

通常是这样
那我现在只是要让你见识一下他的发挥空间很大的

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值