二、列表、字典和集合的处理
filter
函数筛选列表中符合条件的数据
filter
过滤列表中的元素,并且返回一个由所有符合要求的元素所构成的列表,而表达式可以使用 lambda 表达式一行搞定
nums = [1, -1, 10, 2, 5, -9, -8, 7] _nums = list(filter(lambda x: x >= 0, nums)) if __name__ == '__main__': print(_nums) 复制代码
执行上述代码,输出结果如下:
列表解析
筛选出列表中符合条件的数据
列表解析(又称列表推导式)提供了一种简明扼要的方法来创建列表。
它的结构是在一个中括号里包含一个表达式,然后是一个 for
语句,然后是 0 个或多个 for
或者 if
语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 if
和 for
语句为上下文的表达式运行完成之后产生。
var = [out_exp for out_exp in input_list if out_exp == 2] 复制代码
使用列表解析筛选数据可以将 if
条件替换为指定的条件,如 item > 0
即可获取目标列表。
nums = [1, -1, 10, 2, 5, -9, -8, 7] _nums = [num for num in nums if num > 0] if __name__ == '__main__': print(_nums) 复制代码
执行上述代码,输出结果如下:
用列表解析
的解决方式比 filter()
函数的解决方式要高效,但是这两种方式都远快于通过 for 循环
的解决方式
字典解析
筛出字典中符合条件的元素
字典解析与列表解析类似,只不过字典解析要循环 k 和 v,并且使用 { }
来包裹
dict_data = { "peter": 80, "stark": 99, "thor": 60, "banner": 98, "clint": 80 } # 筛选出 value 大于 90 的键值对 _dict_data = {k : v for k, v in dict_data.items() if v > 90} print(_dict_data) 复制代码
执行上述代码,输出结果如下:
集合解析
筛出集合中符合条件的元素
集合解析与列表解析类似,区别在于集合解析使用的是 { }
d = [1, 2, 2, 3, -3, 9, 0, 11, 20, 33] set_data = set(d) # 删除除以 2 余数为 0 的元素 _set_data = {x for x in set_data if x % 2 == 0} print(_set_data) 复制代码
执行上述代码,输出结果如下:
三、统计相关
如何统计序列中元素出现的频率并排序?
统计序列中元素出现的频率的结果肯定是一个字典,Key 为序列中的元素而 Value 为元素出现的次数,因此可以先创建一个字典,作为初始的统计结果,并假设初始出现的次数都为 0。
对频率结果字典的 Value 进行排序
from random import randint # 生成包含重复元素的随机序列 nums = [randint(0, 10) for num in range(20)] # 元素出现次数的统计最终肯定是一个字典,因此可以以元素的Key,出现的次数为Value count = dict.fromkeys(nums, 0) # 统计频次 for num in nums: count[num] += 1 # 排序方案一 # 根据Value进行排序 _count = sorted(count.values()) # 获取最大的次数 max = _count.pop() keys = [] # 根据Value获取Key for k, v in count.items(): if v == max: keys.append(k) if __name__ == '__main__': print(nums) print(count) print(_count) print(max) print(keys) 复制代码
出现的最大频次为4,且频次为4的元素是9和1
使用 Counter 对象进行排序
# 排序方案二 from collections import Counter _count = Counter(count) # 中间代码不变 if __name__ == '__main__': print(nums) print(count) print(_count) print(_count.most_common()) # 获取出现频次最高的三个元素 print(_count.most_common(3)) 复制代码
统计单词次数
要统计一段文本中出现频次最高的单词也可以使用到 Counter 对象,这里以 Python 之禅
这段文本为例,统计出现次数最多的前三个单词。
import re from collections import Counter zen = open('zen.txt').read() # 分割所有单词 zen = re.split('\W+', zen) # print(zen) _zen = Counter(zen) print(_zen) _zen_3 = _zen.most_common(3) print('前三个出现频次最高的词:', _zen_3) 复制代码
执行上述代码,输出结果如下:
调用 Counter 对象的 most_common 方法并输出指定的参数如频次最高的前三个词,输入参数 3 即可获取。