Contents
20.8.1. 实用技巧进阶一¶
如何在列表中根据条件筛选数据¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/17 22:34
# filename: 1.如何在列表中根据条件筛选数据.py
data = [-1, 2, 3, -4, 5]
# 方式1
new_data = []
for i in data:
if i > 0:
new_data.append(i)
print(new_data) #[2, 3, 5]
# 方式2,列表推导式
new_data2 = [i for i in data if i > 0]
print(new_data2) #[2, 3, 5]
# 方式3,filter函数
new_data3 = list(filter(lambda i: i > 0, data))
print(new_data3) #[2, 3, 5]
如何在字典中根据条件筛选数据¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/17 22:49
# filename: 02.如何在字典中根据条件筛选数据.py
from random import randint
# 生成字典
d = {'student%d' % i: randint(100, 200) for i in range(1, 21)}
print(d)
# 方法1
d1 = {k: v for k, v in d.items() if v > 150}
print(d1)
#{'student15': 185, 'student1': 171, 'student7': 192, 'student19': 191, 'student2': 158, 'student16': 152, 'student13': 168, 'student9': 173}
# 方法2
d2 = dict(filter(lambda item: item[1] > 150, d.items()))
print(d2)
#{'student15': 185, 'student1': 171, 'student7': 192, 'student19': 191, 'student2': 158, 'student16': 152, 'student13': 168, 'student9': 173}
如何在集合中根据条件筛选数据¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:20
# filename: 03.如何在集合中根据条件筛选数据.py
from random import randint
s = {randint(0, 20) for _ in range(20)}
print(s)
hu1 = {x for x in s if x % 3 == 0}
print(hu1)
如何为元祖中的每个元素命名,提高程序可读性¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:23
# filename: 04.如何为元祖中的每个元素命名,提高程序可读性.py
def func(student):
if student[1] < 18:
pass
if student[2] == 'male':
pass
s1 = ('derek', 22, 'male', '111@qq.com')
# 第一种:使用枚举
from enum import IntEnum
class StudentEnum(IntEnum):
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3
print(s1[StudentEnum.NAME])
print(s1[StudentEnum.AGE])
print(s1[StudentEnum.SEX])
print(s1[StudentEnum.EMAIL])
print("*" * 50,"使用collections.namedtuple来实现", "*" * 50)
# 第二种:使用标准库中collections.namedtuple替代内置tuple
from collections import namedtuple
Student = namedtuple('student', ['name', 'age', 'sex', 'email'])
s2 = Student('derek', 22, 'male', '222@qq.com')
print(s2[0]) # derek
# 可以通过s2.name获取姓名
print(s2.name) # derek
如何根据字典中值的大小,对字典中的项进行排序¶
#!/usr/bin/env python
#-*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:26
# filename: 05.如何根据字典中值的大小,对字典中的项进行排序.py
# 1.5.如何根据字典中值的大小,对字典中的项进行排序
from random import randint
d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
#第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v,k) for k,v in d.items()]
#或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
print(list1)
list1 = sorted(list1,reverse=True)
print(list1)
如何根据字典中值的大小,对字典中的项进行排序¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:33
# filename: 06.如何根据字典中值的大小,对字典中的项进行排序.py
# 方式1
from random import randint
d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
# 第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v, k) for k, v in d.items()]
# 或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
print(list1)
list1 = sorted(list1, reverse=True)
print(list1)
# 方式2 使用sorted排序
p = sorted(d.items(), key=lambda item: item[1], reverse=True)
print(p)
# 对分数添加一个排名
d = {k: (i, v) for i, (k, v) in enumerate(p, 1)}
print(d)
如何统计序列中元素的频度¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:37
# filename: 07.如何统计序列中元素的频度.py
# 1.6如何统计序列中元素的频度
from random import randint
from collections import Counter
data = [randint(1, 5) for _ in range(1, 20)]
print(data) # [5, 2, 1, 2, 5, 3, 1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5]
# 计算频度最高的是三个数
c = Counter(data)
print(c.most_common(3)) # [(1, 5), (3, 4), (2, 4)]
如何快速找到多个字典中的公共键¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:37
# filename: 08.如何快速找到多个字典中的公共键.py
from random import randint, sample
from functools import reduce
d1 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}
d2 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}
d3 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}
# 1.使用字典的keys()方法,得到一个字典keys的集合
# 2.使用map函数,得到每个字典keys的集合
# 3.使用reduce,取所有字典keys集合的交集
dl = [d1, d2, d3]
# 找到三个字典中相同的keys
result = reduce(lambda a, b: a & b, map(dict.keys, dl))
print(result)
如何让字典保持有序¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:39
# filename: 09.如何让字典保持有序.py
from collections import OrderedDict
from itertools import islice
d = OrderedDict()
d['e'] = 5
d['d'] = 4
d['c'] = 3
d['b'] = 2
d['a'] = 1
print(d) # OrderedDict([('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)])
# OrderedDict字典,在迭代操作时,它会保持元素被插入时的顺序
def query_by_order(d, a, b=None):
if b is None:
b = a + 1
return list(islice(d, a, b))
# 第五个key
res1 = query_by_order(d, 4)
print(res1) # ['a']
# 第二个和第三个key
res2 = query_by_order(d, 1, 3)
print(res2) # ['d', 'c']
如何实现用户的历史记录功能¶
#!/usr/bin/env python
#-*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:41
# filename: 10.如何实现用户的历史记录功能.py
"""
使用容量为n的队列存储历史记录
使用deque双端循环队列存储历史记录(deque是保存到内存中,下次启动历史记录会消失)
如果想保存到硬盘中,使用pickle模块,以便下次启动使用
"""
from random import randint
from collections import deque
import pickle
def guess(n, k):
if n == k:
print('猜对了,这个数字是%d' % k)
return True
if n < k:
print('猜大了,比%d小' % k)
elif n > k:
print('猜小了,比%d大' % k)
return False
def main():
n = randint(1, 100)
i = 1
hq = deque([], 5)
while True:
line = input('[%d]请输入一个数字:' % i)
if line.isdigit():
k = int(line)
hq.append(k)
i += 1
if guess(n, k):
break
elif line == 'quit':
break
elif line == 'history':
print(hq)
if __name__ == '__main__':
main()