美文网首页
python高级编程技巧(1)

python高级编程技巧(1)

作者: 我是一条池中鱼 | 来源:发表于2017-10-11 21:34 被阅读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)
    
    
    要努力要奋斗

    相关文章

      网友评论

          本文标题:python高级编程技巧(1)

          本文链接:https://www.haomeiwen.com/subject/pxrgyxtx.html