python高级编程技巧(1)

2017-10-11  本文已影响0人  我是一条池中鱼

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

实际案例:

  1. 过滤掉列表[3,6,7,9,-1,-2,...]中的负数
  2. 筛选字典{"LiLei":79, 'Jin':88, 'Lucy':92 ...}中值高于90的项
  3. 筛出集合{77, 89, 32, 20 ...}中能被3整除的元素
解决方案:

列表:
filter函数 ---> filter(lambda x : x>= 0,data)
列表解析 ---> [x for x in data if x >= 0]
字典:
字典解析 ---> {k: v for k, v in d.items() if v > 90}
集合:
集合解析 ---> {x for x in s if x % 3 == 0 }

代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/9 10:12
# @File     : 字符串处理.py
from random import randint
import timeit
#处理列表中的元素
data = [randint(-10, 10) for _ in range(10)] #列表推导式
#方法 1
ls = []
for i in data:
    if i > 0:
        ls.append(i)
print(ls)
#方法 2
s = filter(lambda  x : x > 0 ,data)
print(list(s))#使用filter函数比使用list追加元素方法速度更快
#方法 3
print([x for x in data if x < 0 ])#使用列表推导式速度更快

###########################################################
#对字典中的元素进行处理
from random import  randint

d = {x : randint(60, 100) for x in range(1,21)}
print(d)
s = {k : v for k,v in d.items() if v > 90}#字典解析
print(s)

############################################################
#对集合中的元素进行处理
s = set(randint(-10,10) for x in range(10))
print(s)
ss = {x for x in s if x % 3 == 0}#集合推导式类似于字典解析式
print(ss)

二. 如何为元组中的每个元素命名,提高程序可读性

实际案例:

  1. 学生信息系统中数据为固定格式:(名字,年龄,性别,邮箱地址...)
    学生数量很大为了减小存储开销,对每个学生信息用元组表示:
    ('Jin', 16, 'male', 'JIn3322@gmial.com')
    ('LiLei', 17, 'male', 'LiLei3325@qq.com')
    ('Lucy', 19, 'female', 'Lucy@yahoo.com;)
    ......
    访问时,我们使用引索(index)访问,大量引索降低程序可读性,如何解决这个问题?
解决方案:
  1. 定义类似于其他语言的枚举类型,也就是定义一系列数值常量
  2. 使用标准库中collections.namedtuple替代内置tuple
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/9 11:00
# @File     : 元组元素命名处理.py
"""
使用元组存储数据时,当我们要访问元组中的字段的时候,会使程序中大量出现
0,1,2这样的索引,这样会导致程序的不易维护和阅读

"""
# 方法  1 :定义类似于其他语言的枚举类型,也就是定义一系列的数值常量
NAME, AGE, SEX, EMAIL = range(4) #对别名进行赋值
student = ("Jin", 19, "male", "1@1.com")
#name
print(student[NAME]) #使用别名访问数据
#age
if student[AGE] >= 19:
    pass
#sex
if student[SEX] == 'male':
    pass
#.....

#方法 2 : 利用标准库中的collections.namedtuple替代内置的tuple
from collections import namedtuple
Student = namedtuple("Student", ["name","age","sex","email"])
s = Student("Jin", 19, "male", "1@1.com")#位置传参
s1 = Student(name = "Jin",age= 19, sex = "male", email = "1@1.com")#关键字传参,必须和定义的顺序相同
print(s.name)#利用属性访问元组数据
print(s1.name)
print(isinstance(s , tuple))

三. 如何统计序列中元素出现的频度

实际案例:

  1. 某随机序列[12, 4, 5, 6, 5, 3, 3, 6, 7, ...]中,找到出现次数最高的3个元素,他们出现次数是多少?
  2. 对某英文文章的单词,进行词频统计,找到出现次数最高的10个单词,他们出现的次数是多少?
解决方案:
  1. 使用collections.Counter对象
  2. 将序列传入Counter构造器,得到Counter对象是元素频度的字典
  3. Counter.most_common(n)方法得到频度最高的n个元素的列表
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/9 11:17
# @File     : 统计序列元素出现频度.py

from random import randint
data = [randint(0,20) for _ in range(30)] #能出现重复的元素
print(data)

#输出统计格式:(2:3, 12: 2, 11: 5)字典格式
c = dict.fromkeys(data, 0)#以data作为键, 0 作为初始值 的字典
print(c)

#方法 1:对每次出现的元素,在字典中的值上加 1
for x in data:
    c[x] += 1
print(c)

########################################

# 方法 2:使用collections下的Counter对象,Counter专门处理类似的问题
from collections import Counter

c2 = Counter(data)#也是得到一个字典
c3 = c2.most_common(3)#出现频度最高的 3 个元素
print(c2)
print(c3)

要努力要奋斗
上一篇下一篇

猜你喜欢

热点阅读