轻松玩转AI(从Python开始之Python3进阶)

本文介绍了Python3在AI实践中的数据结构与算法、字符串处理、迭代与反迭代、文件I/O及数据解析等关键技巧。内容包括列表、字典、集合的筛选,元组命名,字典排序,序列元素频度统计,多字典公共键,有序字典,历史记录管理,字符串拆分、格式调整,迭代器实现,文件缓冲和映射,以及数据解析与构建等方法。
摘要由CSDN通过智能技术生成

轻松玩转AI路径:

  1.   从Python开始 [链接]
  2.  数据科学 [链接]
  3.  机器学习 [链接]
  4.  深度学习——神经网络 [链接]

从Python开始


Python3进阶 目录:


一、数据结构与算法相关问题与解决技巧

1. 如何在列表, 字典, 集合中根据条件筛选数据

实际案例:
如何在列表, 字典, 集合中根据条件筛选数据

解决方案:
如何在列表, 字典, 集合中根据条件筛选数据2

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)

实际案例:
如何快速找到多个字典中的公共键(key)

解决方案:
方案1:列表式

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值