Python3 高级编程技巧(部分)

目录:


在列表、字典、集合中筛选数据

示例数据:
data_list = [ 52, 68, 20, 85, 63, 21, 14, 85 ]
data_dict = { ‘数学’:56, ‘英语’:68, ‘语文’:55, ‘生物’:72, ‘物理’:92, ‘体育’:32 }
data_set = { 52, 68, 20, 85, 63, 21, 14, 85 }

  • 列表
    • [ x for x in data_list if x > 60 ]
    • filter(lambda x: x > 60, data_list) # 注:filter返回的是迭代器
  • 字典
    • { key: val for key, val in d.items() if val > 60 }
  • 集合
    • { x for x in data_set if x > 60 }

为元组元素命名

如果我们的数据有固定的格式如学生信息有姓名、性别、年龄等等,这时我们通常使用元组储存数据,以此减少内存开销。
但因此不能像字典那样以键访问值,因此,我们需要一个兼具字典和元组优点的类型。

> 命名元组 collections.namedtuple

from collections import namedtuple
Student = namedtuple('Student', ['name', 'sex', 'age'])
s1 = Student('Tom', '男', 18)
print(s1[1])  # '男'
print(s1.age) # 18


通过列表、元组创建字典

> dict.fromkeys

如下,我打算统计 data_list 中每个数字出现的频率

data_list = [1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 8, 9, 9]
stat = dict.fromkeys(data_list, 0)
print(stat) # {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 8: 0, 9: 0}
for k in data_list:
    stat[k] += 1
print(stat) # {1: 3, 2: 2, 3: 1, 4: 4, 5: 2, 6: 1, 8: 1, 9: 2}


字典排序

假设我有某班数学成绩的字典型数据,我需要对其进行排序

score = {
 '龙密': 51,
 '于飞': 49,
 '朱行': 34,
 '赖国': 48,
 '杜佺': 37,
 '谢香': 55,
 '秦香': 30,
 '陆玟': 67,
 '任姑': 57,
 '常晓': 92
}
  • zip + sorted

tmp = zip(score.values(), score.keys()) # zip返回的是迭代器,内容为[(51,'龙密'),(49,'于飞'),(34,'朱行'),...]
result = sorted(tmp) # 使用 sorted(tmp, reverse=True) 进行降序排序
print(tmp) # [(30, '秦香'), (34, '朱行'), (37, '杜佺'), (48, '赖国'), ...]
  • sorted (使用key参数)

print(score.items()) # .items() 返回了元组列表 [('龙密', 51), ('于飞', 49), ('朱行', 34), ...]
result = sorted(score.items(), key=lambda item: item[1])
print(result) # 结果 [('秦香', 30), ('朱行', 34), ('杜佺', 37), ...]

注:似乎第一种快点,是不是很反直觉呀


寻找字典的公共键

利用集合

r1 = {'苏亚雷斯':1,'梅西':2,'本泽马':1,'c罗':3}
r2 = {'苏亚雷斯':1,'c罗':1,'格里兹曼':2,'贝尔':1}
print(r1.keys() & r2.keys()) # { 'c罗', '苏亚雷斯' }


让字典保持有序

> 有序字典 collections.OrderedDict

from collections import OrderedDict
od = OrderedDict()
od['first'] = '这是第一条数据'
od['second'] = '这是第二条数据'
od['third'] = '这是第三条数据'
for key,val in od.items():
    print(key, val)
'''输出如下
first 这是第一条数据
second 这是第二条数据
third 这是第三条数据
'''


生成器函数

def getId():
	i = 0
	while(True):
		i += 1
		yield i

id = getId()
for _ in range(10):
	print(next(id))
'''结果
1
2
3
...
'''


yield协程

使用协程计算平均数

def average():
    count, total, arg = 0, 0, 0
    while True:
        val = yield arg
        if val:
            total += val
            count += 1
            arg = total / count

data = [15, 56, 85, 25, 36, 45, 20, 21, 2]
arg = average()
next(arg) # 预激
for val in data:
    print(arg.send(val))
print('平均数:', next(arg))
'''结果
15.0
35.5
52.0
45.25
43.4
43.666666666666664
40.285714285714285
37.875
33.888888888888886
平均数: 33.888888888888886
'''


同时遍历值与下标

> enumerate

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
for i, v in enumerate(seasons):
	print('{}:  {}'.format(i, v))
'''返回
0:  Spring
1:  Summer
2:  Fall
3:  Winter
'''

猜你喜欢

转载自blog.csdn.net/weixin_40522523/article/details/88609781