来自B站
在列表,字典,集合中根据条件筛选数据
示例:
1 from random import randint 2 3 # 根据条件筛选数据 4 5 lst = [23,56,67,89,0,98,45,67,46,65] 6 7 # 列表解析 -- 推荐 8 new_lst1 = [n for n in lst if n >= 60] 9 print(new_lst1) 10 11 # filter()函数解析 12 new_lst2 = filter(lambda x: x >=60 , lst) 13 print(list(new_lst2)) 14 15 # 用字典解析创建数据 16 dic = {'Student%d' % i: randint(0,100) for i in range(1,20)} 17 print(dic) 18 19 # 字典解析筛选数据 - 推荐 20 new_dict1 = {k:v for k,v in dic.items() if v >= 60} 21 print(new_dict1) 22 23 # filter()函数解析字典 24 new_dict2 = filter(lambda item: item[1] >= 60, dic.items()) 25 print(dict(new_dict2)) 26 27 # 集合解析 - 推荐 28 s = {randint(0,20) for _ in range(20)} 29 new_s = {x for x in s if x % 3 == 0} 30 print(new_s)
为元组中的每个元素命令,提高程序可读性。元组比其他类型的优点:节省空间
示例:
1 # 方法1: 枚举 2 from enum import IntEnum 3 4 s = ('Su',12,'male','123@qq.com') 5 6 class StudentEnum(IntEnum): 7 NAME = 0 8 AGE = 1 9 SEX = 2 10 EMAIL = 3 11 12 print(s[StudentEnum.NAME]) # 输出 Su 13 print(s[StudentEnum.AGE]) # 输出 12 14 15 16 # 方法2: 使用标准库中collections.nametuple 替代内置tuple - 推荐 17 from collections import namedtuple 18 Student = namedtuple('Student',['name','age','sex','email']) 19 s2 = Student('Su',12,'male','123@qq.com') 20 print(s2) # 输出 Student(name='Su', age=12, sex='male', email='123@qq.com') 21 print(s2[1]) # 输出 12 22 print(s2.age) # 输出 12
根据字典中值的大小,对字典中的项排序
示例
1 # 将字典中的各项转换成元组,使用内置函数sorted排序 2 3 # 方法1:将字典中的项转化为(值,键)元组。(列表解析或zip) 4 from random import randint 5 6 old_dict = {k: randint(0,100) for k in 'abcdefghijkl'} 7 print(old_dict) # 输出字典 8 # 列表解析 转成元组 9 dict_to_tuple = [(v,k) for k,v in old_dict.items()] 10 # zip函数 转成元组 11 # dict_to_tuple = list(zip(old_dict.values(),old_dict.keys())) 12 print(dict_to_tuple) # 输出列表,元素是元组 13 print(sorted(dict_to_tuple)) # 升序 输出列表,元素是元组 14 print(sorted(dict_to_tuple,reverse=True)) # 倒序 输出列表,元素是元组 15 16 # 方法2:传递sorted函数的key参数 17 p = sorted(old_dict.items(),key=lambda item: item[1],reverse=True) 18 print(p) # 倒序 输出列表,元素是元组,key在前 value在后的元组 19 p_num = list(enumerate(p,1)) # 第2个参数1是指从1开始算 20 print(p_num) # 输出 [(1, ('i', 94)), (2, ('l', 81)), (3, ('g', 80))。。。。=》 顺序,(key, value) 21 d = {k:v for i, (k,v) in p_num} 22 print(d) #输出倒序的字典
统计序列中元素的频度
示例:对数字进行统计,并取最大前几位
1 from random import randint 2 3 data = [randint(0,5) for _ in range(10)] 4 print(data) 5 6 # 方法1:将序列转换为字典{元素:频度},根据字典中的值排序 7 d = dict.fromkeys(data,0) # data列表的元素作key,0为设置的value 8 print(d) 9 10 for x in data: 11 d[x] += 1 # 循环列表,元素每出现一次,累加一次到字典上 12 print(d) 13 14 # 以value作排序,取最高前三个 15 # res = sorted([(v,k) for k,v in d.items()], reverse=True)[:3] # 列表解析 16 res = sorted(((v,k) for k,v in d.items()), reverse=True)[:3] # 生成解析,比列表解析更节省空间 17 print(res) 18 19 # 当列表数据量很大,但只查出现次数最大的几个时,上面这种方法就有缺点了:浪费 20 # 推荐heapq模块方法查找最大几个或最小几个元素 21 import heapq 22 res = heapq.nlargest(3, ((v,k) for k,v in d.items())) 23 print(res) 24 25 # 方法2:使用标准库collections中的Counter对象。 --- 推荐 26 from collections import Counter 27 c = Counter(data) 28 res = c.most_common(3) # 查找前三个 29 print(res)
示例:对文件内容字符串出现的次数作统计
1 import re 2 from collections import Counter 3 4 # 读取文件 5 with open('1.txt','r') as f: 6 allData = f.read() # 读出str类型 7 8 world_lst = re.split('\s+',allData) # 空格、换行...进行分割 9 c = Counter(world_lst) 10 res = c.most_common(5) # 字符串出现次数最高的前5个 11 print(res)
在多个字典中寻找公共键
示例:方法1,和方法3都可用
1 from random import randint 2 3 dict1 = {k:randint(0,5) for k in 'ABCDEFG'} 4 dict2 = {k:randint(0,5) for k in 'ABCFG'} 5 dict3 = {k:randint(0,5) for k in 'ABCDE'} 6 dict4 = {k:randint(0,5) for k in 'ACDEFG'} 7 all_dict = [dict1, dict2, dict3, dict4] 8 9 # 方法1 10 res = [k for k in all_dict[0] if all(map(lambda d: k in d, all_dict[1:]))] 11 print(res) 12 13 14 from functools import reduce 15 # 利用集合(set)的交集操作 16 17 # 方法2 18 # 使用字典的key()方法,得到一个字典keys的集合 19 s1 = dict1.keys() 20 s2 = dict2.keys() 21 s3 = dict3.keys() 22 s4 = dict4.keys() 23 print(s1 & s2 & s3 & s4) # 如果有很多字典,这方法就太繁琐了 24 # 使用map函数,得到每个字典keys的集合 25 s = list(map(dict.keys,all_dict)) # 得到的是每个字典的key,未集合 26 print(s) 27 28 # 方法3 29 # 使用reduce函数,取所有字典的keys集合的交集 30 res = reduce(lambda a, b: a & b, map(dict.keys,all_dict)) # 得到每个字典key交集 31 print(res)
让字典保持有序
示例:OrderedDict()函数,按写入顺序排序的字典;查找key在字典的位置;字典某些位置的成员key是什么
1 from collections import OrderedDict 2 3 od = OrderedDict() #一个字典,自动按照写入顺序排序 4 # od['s'] = 2 5 # od['w'] = 1 6 # od['p'] = 7 7 # print(od.keys()) 8 9 from random import shuffle 10 players = list('abcdefg') 11 shuffle(players) # 打乱列表顺序 12 print(players) 13 14 for i, p in enumerate(players, 1): # 从1开始,给players元素带个数字 15 od[p] = i 16 print(od) 17 18 def query_by_name(d,name): # 某个key在字典的第几个成员 19 return d[name] 20 21 print(query_by_name(od,'c')) 22 23 from itertools import islice 24 25 def query_by_position(d,start_position, end_position=None): 26 start_position -= 1 27 if end_position is None: 28 end_position = start_position + 1 29 return list(islice(d, start_position, end_position)) 30 31 print(query_by_position(od, 3)) # 字典第3个成员key是 32 print(query_by_position(od, 3, 6)) # 字典第3~6的成员key是
用户的历史记录功能(最多n条)
示例:保存在磁盘;保存在本地
1 from collections import deque 2 3 # deque() 双端队列 4 dq = deque([], 5) # 第一个参数是队列初始化,参数5是容量,不填则容量无限大 5 # dq.appendleft() # 左端入队, 要保持同端入队 6 dq.append(2) # 右端入队 7 dq.append(3) 8 dq.append(4) 9 dq.append(5) 10 dq.append(1) 11 dq.append(6) 12 print(list(dq)) # 输出[3, 4, 5, 1, 6]。当容量满了时,继续入队,则最开始入队的就会从左端出队 13 14 # 上面的存入是在磁盘中,以下为保存在本地文件 15 import pickle 16 17 pickle.dump(dq, open('saveLocal.pkl', 'wb')) # 二进制,写入 18 res = pickle.load(open('saveLocal.pkl', 'rb')) # 读取 19 print(res)