轻松玩转AI路径:
- 从Python开始 [链接]
- 数据科学 [链接]
- 机器学习 [链接]
- 深度学习——神经网络 [链接]
从Python开始
Python3进阶 目录:
一、数据结构与算法相关问题与解决技巧
1. 如何在列表, 字典, 集合中根据条件筛选数据
实际案例:
解决方案:
1)列表解析:过滤掉列表中的负数
# 方法1:循环遍历
data = [-1,2,3,-4,5]
res = []
for x in data:
if x>= 0:
res.append(x)
print(res)
# 方法2:列表解析
# 利用内置函数filter生成器对象(一次性)
form random import randint
# 创建一个元素有十个的 -10~10 之间的随机列表
l = [randint(-10, 10) for _ in range(10)]
res = [x for x in l if x >= 0] # (更优)
# 或:
res = list(filter(lambda x: x >= 0, l))
2)字典解析:筛选出字典中值高于90的项
form random import randint
d = {
'student%d' % i: randint(50, 100) for i in range(1, 21)}
g = {
for k, v in d.items() if v >= 90}
# 或:
g = dist(filter(lambda item: item[1] >= 90, d.items()))
3)集合解析:筛选出集合中能被3整除的元素
form random import randint
s = {randint(0, 20) for _ in range(20)}
g = {x for x in s if x % 3 == 0}
2. 如何为元组中的每个元素命名, 提高程序可读性
实际案例:
解决方案:
方案1:定义一系列数值常量或枚举类型
方案2:使用标准库中 collections.namedtuple 命名元组 替代内置 tuple
方案1:
# 方法1:数值常量
NAMEM, AGE, SEX, EMAIL = range(4)
def xxx_func(student):
if student[AGE] < 18:
pass
if student[SEX] == 'male':
pass
...
student = ('Jim', 16, 'male', 'jim8721@gmail.com')
xxx_func(student)
# 方法2:枚举类型
s = ('Jim', 16, 'male', 'jim8721@gmail.com')
from enum import IntEnum
class StudentEnum(IntEnum):
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3
s[StudentEnum.NAME] # 返回:'Jim'
方案2:
from collections import namedtuple
# 创建命名元组类
Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
# 实例化。元组。
s2 = Student('Jim', 16, 'male', 'jim8721@gmail.com')
s2.name # 返回:'Jim'
3. 如何根据字典中值的大小, 对字典中的项排序
实际案例:
解决方案:
将字典中的各项转化为元组,使用内置函数 sorted 排序。
方案1:将字典中的项转化为(值, 键)元组。(列表解析或 zip)
from random import randint
d = {k: randint(60, 100) for k in 'abcdefgh'}
l = [(v, k) for k, v in d.items()]
sorted(l, reverse=True)
# 或:
list(zip(d.values(), d.keys()))
方案2:传递 sorted 函数的 key 参数
from random import randint
d = {k: randint(60, 100) for k in 'abcdefgh'}
p = sorted(d.items(), key=lambda item: item[1], reverse=True)
# list(enumerate(p, 1))
for i,(k, v) in enumerate(p, 1):
d[k] = (i, v)
# 或:
{k:(i, v) for i, (k, v) in enumerate(p, 1)}
4. 如何统计序列中元素的频度
实际案例:
解决方案:
例1方案1:将序列转换为字典 {元素 : 频度},根据字典中的值排序。
# 方法1:
from random import randint
data = [randint(0, 20) for _ in range(30)]
d = dict.fromkeys(data, 0)
for x in data:
d[x] += 1
sorted([(v,k) for k,v in d.items()], reverse=True)[:3]
# 或:
sorted(((v,k) for k,v in d.items()), reverse=True)[:3]
# 方法2: 使用堆 (更优)
import heapq
heapq.nlargest(3, ((v,k) for k,v in d.items())) # 取最大
# heapq.nsmallest() # 取最小
例1方案2:使用标准库 collections 中的 Counter 对象。
from collections import Counter
data = [randint(0, 20) for _ in range(30)]
d = dict.fromkeys(data, 0)
for x in data:
d[x] += 1
c = Counter(data)
c.most_common(3)
例2方案:
txt = open('example.txt').read() # 读取一个含单词文件
import re
word_list = re.split('\W+', txt)
c2 = Counter(word_list)
c2.most_common(10)
5. 如何快速找到多个字典中的公共键(key)
实际案例:
解决方案:
方案1:列表式