《Python一行流》学习笔记1——列表解析

1 列表解析语法

[ 表达式 + 上下文]
# []方框号代表结果生成一个列表
# 表达式定义了在元素添加到列表之前,需要对元素进行怎样的修改;表达式可以是上下文中定义的任何变量的函数,可以进行任意计算,甚至可以调用外面的函数
# 上下文决定了要选择哪些列表元素

# 列子1
[x * 2 for x in range(10) if x % 2 == 1]
# 输出:[2, 6, 10, 14, 18]
# 上下文为:for x in range(10) if x % 2 == 1,表示x的值会从range函数返回的(0, 1, ..., 9)中进行迭代,if条件语句保证了只有奇数才能被遍历到
# 表达式为:x * 2,表示将上下文得到的数进行 *2 

# 例子2
[(x, y) for x in x in range(3) for y in range(3)]
# 输出:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
# 表达式 (x, y) 表示把上下文传过来的x和y组合成一个元组
# 上下文 for x in x in range(3) for y in range(3):x的值会从range函数返回的(0, 1, 2)中进行迭代;y也会从range函数返回的(0, 1, 2)中迭代。两个循环是嵌套的,从输出结果也可以看出,对于x的每一个值,y都会重复一遍迭代过程,因此该上下文变量会有3*3=9中组合
   #该列表解析等价于:
        ans = []
        for x in range(3):
            for y in range(3):
                ans.append((x, y))
        # 可以看到列表推导式是多么的整洁优雅啊

2 项目1:使用列表解析找出最高收入者

2.1 问题描述

        假设你在一家大公司的人力资源部门工作,需要找到所有年薪至少10万美元的员工。你希望输出一个元组的列表,每个元组由两个值组成——员工姓名和员工的年薪。

2.2 问题解决

        对于给定的一个包含字符串和对应整数值的字典,创建一个由元组(键, 值)组成的列表,其中每个于键相关联的值都大于或等于10万。

# 原始数据
employees = {'Alice': 100_000,
             'Bob': 99_817,
             'Carol': 122_908,
             'Frank': 88_123,
             'Eve': 93_121}

# 一行流
top_earners = [(k, v) for k, v in employees.items() if v >= 100_000]
# 表达式:对于每一组上下文 k, v,创建一个简单的(k, v)键值对元组
# 上下文:字典方法 dict.items() 确保上下文变量 k 遍历该字典所有的键,同时上下文变
#        量 v 会遍历对应的值。if条件保证了只有当值大于或等于10万时,才会遍历到

# 结果
print(top_earners)
# [('Alice', 100000), ('Carol', 122908)]

3 项目2:使用列表解析找出高信息价值的单词

3.1 问题描述

        搜索引擎对文本信息的排名,是根据其于用户查询关键词的相关程度来进行的。为了达到这个目的,搜索引擎会对要搜索的文本内容进行分析。所有的文本都有词语组成,有些词提供了大量关于本本内容的信息,而有些则没有。前者的例子像是white、whale、Captain、girl这种词,后者则像是is、to、as——因为大多数文本都会包含这些词。在开发搜索引擎时,过滤掉那些对文章意义贡献不大的词是常见的做法。一个简单的启发式方法是过滤掉所有长度小于或等于3各字母的单词。

3.2 问题解决

        对于给定的一个多行字符串,生成一个列表,列表中每个元素也是一个列表,由一行中所有多于3各字符的单词组成。

# 文本数据
text = '''I have a dream that one day every valley shall be exalted, 
and every hill and mountain shall be made low, the rough 
places will be made plain, and the crooked places will be 
made straight; "and the glory of the Lord shall be revealed 
and all flesh shall see it together'''

# 一行流
w = [[x for x in line.split() if len(x) > 3] for line in text.split('\n')]
# 1、内层的列表系欸西表达式 [x for x in line.split() if len(x) > 3] 使用字符串
#   的split()函数把一行文本划分为若干单词的序列。使用遍历所有的单词,如果超过3各字符
#   串,则把它加入列表
# 2、外层的列表解析表达式则创建了上面语句中所要用到的单行文本。使用split('\n')把文本
#   切分为单行

# 结果
print(w)
# [['have', 'dream', 'that', 'every', 'valley', 'shall', 'exalted,'], 
# ['every', 'hill', 'mountain', 'shall', 'made', 'low,', 'rough'], 
# ['places', 'will', 'made', 'plain,', 'crooked', 'places', 'will'], 
# ['made', 'straight;', '"and', 'glory', 'Lord', 'shall', 'revealed'], 
# ['flesh', 'shall', 'together']]

4 项目3:使用列表解析读取文件

4.1 问题描述

        读取一个文件,并把结果存储在一个由字符串组成的列表中(每行一个字符串),同时还要把这些行中的前导和尾部的空白字符删掉。

4.2 问题解决

         打开一个文件,读取每一行,去掉其前导和尾部的空白字符,并且把结果保存到一个列表中。

# 使用列表解析读取文件

# 本文件的名称
filename = 'readFile.py'

# 一行流
lines = [line.strip() for line in open(filename, encoding='utf-8')]
# strip()函数用于去掉字符串的潜到和尾部的空白字符
# 该列表解析的上下文部分会遍历文件被的每一行,并把结果存储在列表中

# 结果
print(lines)
#['# 使用列表解析读取文件',
# '',
# '# 本文件的名称',
# "filename = 'readFile.py'",
# '',
# '# 一行流',
# "lines = [line.strip() for line in open(filename, encoding='utf-8')]",
# '',
# '# 结果', 
# 'print(lines)']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值