Python实战--第一篇(数据结构相关)

第一部分:如何在字典,列表,集合中根据条件筛选数据?

实例案例:

1,过滤掉列表[3,9,-1,10,20,-2...]中的负数

2,筛选字典{'LiLei':79,'Jim':88,'Lucy':92...}中值高于90的项

3,筛出集合{77,89,32,20...}中能被3整出的元素

传统的方法:迭代方法

data=[1,3,-3,4,6,9]
dt=[]
for x in data:
    if x>0:
        dt.append(x)
print(dt)
在python中我们还可以使用高级方法:函数式编程,字典解析等

解决方法:

列表:

filter函数:filter(lambda x : x>=0,data)

列表解析:[x for x in data if x>=0]

字典:

字典解析:{k: v for k, v  in d.interitems() if v> 90}

集合:

集合解析:{x for x in s if %3 ==0}

栗子一:

fromrandom importrandint#插入randint函数

data =[randint(-10,10)for_inrange(10)]#生成10个随机数

print(list(filter(lambdax: x>=0,data)))#记得使用list()将结果转变为list

 
[x for x in data if x>=0]  #列表解析
列表解析和filter的速度远大于迭代

栗子二:

from random import  randint  #插入randint函数
d={x:randint(60,100)  for x in range(1,21)}  #随机生成字典,1-20代表学号,60-100代表分数
dic={k:v for k,v in  d.items() if v>90}     #通过字典解析,获得大于90的
栗子三:

from random import  randint  #插入randint函数
data =[randint(-10,10) for _ in range(10)]
s=set(data)  #将list变成一个set
se={  x for x in s if x%3==0} #和字典解析不同的是,第一个x后面不再有 :

第二部分:如何为元组中的每个元素命名,提高程序可读性?

实际案例:学生信息系统中数据为固定格式:(元素的位置和个数固定)

(名字,年龄,性别,邮箱地址)

学生数量很大为了减小内存开销,对每个学生信息用元组表示:

('hehe',23,'male','hehe250@gmail.com')

('doubike',24,'male','doubike260@163.com')

('miner',22,'female','miner233@qq.com')

......

访问时,我们使用索引(index)访问,大量索引降低程序可读性。如何解决这个问题?

解决方案:

方案一:定义类似与其他语言的枚举类型,也就是定义一系列数值常量

NAME=0
AGE=1
SEX=2
EMAIL=3 #将索引值列为枚举值
NAME,AGE,SEX,EMAIL=range(0,4) #或者这样写一条
student =('hehe',23,'male','hehe250@gmail.com')
#name
print( student[0])  #大量索引导致异议和可读性
print(student[NAME]) #使用枚举值变量值,方案一

方案二:使用标准库中collections.namedtuple代替内置tuple

#('hehe',23,'male','hehe250@gmail.com')
#('doubike',24,'male','doubike260@163.com')
# ('miner', 22, 'female', 'miner233@qq.com')

from collections import  namedtuple
Student=namedtuple('Student',['name','age','sex','email'])       #namedtuple()函数能够返回内置元组的一个子类,
# 第一个参数为新创建类的名字,之后的参数是对应的索引名字
s1=Student('doubike',24,'male','doubike260@163.com')#通过类创建一个命名的元组
print(s1)
s2=Student(name='hehe', age=23, sex='male', email='hehe250@gmail.com')#使用关键字传参数创建一个命名元组,
#关键字要和之前声明的要一致
print(s2.name)  #使用属性不再使用索引访问元素

并且s1,s2是内置元组tuple的子类


第三部分:如何统计序列中元素的出现频度?

实际案列:

1,某随机序列[12,33,44,55,66,22,44,...]中,找到出现次数最高的3个元素,他们出现次数是多少?

2,对某英文文章的单词进行词频统计,找到出现次数最高的10个单词,他们出现次数是多少?

实例一:对于随机序列

解决方案:

from random import  randint
data=[randint(0,20) for _ in range(0,30)]  #使用列表解析生成20个随机数
c=dict.fromkeys(data,0) #因为最后的结果是一个字典,因此我们设置data为键,初始值为0
for x in data: #遍历随机数据
    c[x]+=1     #将每次遍历到的数加一
print(c)

使用collection.Counter对象

将序列传入Counter的构造器,得到Counter对象是元素频度的字典

Counter.most_common(n)方法得到频度最高的n个元素的列表

from random import  randint
from  collections import  Counter          
data=[randint(0,20) for _ in range(0,30)]  #使用列表解析生成20个随机数
c2=Counter(data)  #将序列中的频度直接统计为字典
mos=c2.most_common(3)   #直接使用函数most_common()统计出频度前三的数
print(mos)
实例二:统计单词数

import  re  #使用正则表达式模块
from  collections import  Counter
txt=open('tes.txt','r') #将文件以只读的方式打开
c3=Counter(re.split('\W+', txt)) #使用正则表达式的分割模块,使用非字母的文件将文件进行分割 ,得到一个列表,并传给counter
c3.most_common(10) #获取前十个频率最高的词

 






















































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值