zoukankan      html  css  js  c++  java
  • 019.Python函数sorted,filter和推导式

    一 sorted函数

    sorted(iterable,reverse=False,key=函数)

    功能:排序
    参数:
        iterable:可迭代性数据(常用:容器类型数据,range对象,迭代器)
        reverse : 是否倒序
        默认正序reverse= False(从小到大) 如果reverse=True 代表倒序 (从大到小)
        key = 自定义函数 或者 内置函数
    返回值:
        排序的序列

    1.1 从小到大默认排序

    listvar = [1,2,-88,-4,5]
    # 从小到大默认排序
    res = sorted(listvar)
    print(res)

    执行

    [root@node10 python]# python3 test.py
    [-88, -4, 1, 2, 5]

    1.2 从大到小排序

    listvar = [1,2,-88,-4,5]
    res = sorted(listvar,reverse=True)
    print(res)

    执行

    [root@node10 python]# python3 test.py
    [5, 2, 1, -4, -88]

    1.3 按照绝对值排序

    需要用到内置函数abs(绝对值函数)

    res = abs(-1.5)
    print(res)
    listvar = [1,2,-88,-4,5]
    res = sorted(listvar,key=abs)
    print(res)

    执行

    [root@node10 python]# python3 test.py
    1.5
    [1, 2, -4, 5, -88]

    1.4 按照余数排列

    listvar = [19,23,44,57]
    def func(n):
            return n % 10
    
    res = sorted(listvar,key=func)
    print(res)
    listvar = [4,1,2,9]
    listvar.sort()
    print(listvar)

    执行

    [root@node10 python]# python3 test.py
    [23, 44, 57, 19]
    [1, 2, 4, 9]

    sort 基于原有列表进行修改
    sorted 是产生一个新列表

    二 filter函数

    filter(func,iterable)
    功能:过滤数据
         如果函数的返回值是True ,代表保留当前数据
         如果函数逇返回值是False,代表舍弃当前数据
    参数:
        func 自定义函数
        iterable 可迭代对象(常用:容器类型数据,range对象,迭代器)
    返回值
        迭代器

    取出所有的偶数

    listvar = [1,2,3,4,4,56,6,6,7,8,9,10]
    # 要所有的偶数,舍弃所有的奇数
    def func(n):
            if n % 2 == 0:
                    return True
            else:
                    return False
    
    
    it = filter(func,listvar)
    res = list(it)
    print(res)

    执行

    [root@node10 python]# python3 test.py
    [2, 4, 4, 56, 6, 6, 8, 10]

    使用匿名函数优化

    listvar = [1,2,3,4,4,56,6,6,7,8,9,10]
    # 要所有的偶数,舍弃所有的奇数
    
    it = filter(lambda n :True  if n % 2 == 0 else False,listvar)
    print(list(it))

    执行

    [root@node10 python]# python3 test.py
    [2, 4, 4, 56, 6, 6, 8, 10]

    三 推导式

    • 通过一行循环判断,遍历出一系列数据的方式是推导式  (简洁方便)

    3.1 列表推导式

    [1,2,3,4] => [2,4,6,8]

    lst = []
    for i in range(1,5):
            print(i)
            lst.append(i)
    print(lst)

    执行

    1
    2
    3
    4
    [1, 2, 3, 4]

    推导式写法

    listvar = [i for i in range(1,5)]
    print(listvar)
    listvar = [i*2 for i in range(1,5)]
    print(listvar)

    执行

    [root@node10 python]# python3 test.py
    [1, 2, 3, 4]
    [2, 4, 6, 8]

    3.1.1 带有判断条件的列表推导式

    [1,2,3,4,4,5,9,6] 只要奇数

    lst = [1,2,3,4,4,5,9,6]
    lst2 = []
    for i  in  lst:
            if i % 2 == 1:
                    lst2.append(i)
    print(lst2)
    #推导式写法
    res = [i for i in lst if i % 2 == 1]
    print(res)

    执行

    [root@node10 python]# python3 test.py
    [1, 3, 5, 9]
    [1, 3, 5, 9]

    3.1.2 带有双循环的列表推导式

    lst1 = [1,2,3]
    lst2 = [4,5,6]
    for i in lst1:
            for j in lst2:
                    print("%d*%d=%2d " % (i,j,i*j))
    #使用推导式 res
    = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2] print(res)

    执行

    [root@node10 python]# python3 test.py
    1*4= 4
    1*5= 5
    1*6= 6
    2*4= 8
    2*5=10
    2*6=12
    3*4=12
    3*5=15
    3*6=18
    ['1*4= 4 ', '1*5= 5 ', '1*6= 6 ', '2*4= 8 ', '2*5=10 ', '2*6=12 ', '3*4=12 ', '3*5=15 ', '3*6=18 ']

    3.1.3 带有条件判断的多循环推导式

    使用两个列表,第一行的和第二行对应相乘

    lst1 = [1,2,3]
    lst2 = [4,5,6]
    for i in lst1:
            for j in lst2:
                    if lst1.index(i) == lst2.index(j):
                            print ("%d*%d=%2d " % (i,j,i*j))
    res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)]
    print(res)

    第一行的奇数和第二行的偶数相乘,并打印

    lst1 = [1,2,3,4]
    lst2 = [5,6,7,8]
    for i in lst1:
            for j in lst2:
                    if i % 2== 1 and j %2 == 0:
                            print ("%d*%d=%2d " % (i,j,i*j))
    #是用推导式 res
    = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if i % 2== 1 and j %2 == 0] print(res)

    执行

    1*6= 6
    1*8= 8
    3*6=18
    3*8=24
    ['1*6= 6 ', '1*8= 8 ', '3*6=18 ', '3*8=24 ']

    推导式的后面:只能是循环或者 判断(单项分支 只有一个if 没有其他的了)
    如果你需要这个值,就把这个值放到for的最左边.

    3.2 集合推导式

    setvar = {} 代表字典
    ()    代表空元祖
    (1)   代表整型1
    (1,)  代表元组
    set() 代表空集合

    案例:判断一个VIP会员

    条件:(1)满足年龄在18到21,存款大于等于5000小于等于5500的人,

    统计结果:尊贵VIP卡老x(姓氏),否则开卡格式为:普通会员老*(姓氏)

    listvar = [
            {"name":"王大宝","age":18,"money":10000},
            {"name":"王二宝","age":19,"money":5100},
            {"name":"王三宝","age":20,"money":4800},
            {"name":"李大宝","age":21,"money":2000},
            {"name":"李二宝","age":180,"money":20}
    ]
    setvar = set()
    print(type(setvar))
    for i in listvar :
            if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21:
                    setvar.add("尊贵vip老"+i['name'][0])
            else:
                    setvar.add("普通会员卡老"+i['name'][0])
    print(setvar)
    #使用三目运算符+推导式
    setvar={"尊贵vip老"+i['name'][0] if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21 else "普通会员卡老"+i['name'][0] for i in listvar}
    
    print(setvar)

    执行

    [root@node10 python]# python3 test.py
    <class 'set'>
    {'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'}
    {'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'}

    3.3 字典推导式

    3.3.1 enumerate函数

    enumerate(iterable,[start=0])  #start是一个可选对象
    功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
    参数:
        iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 
        start:  可以选择开始的索引号(默认从0开始索引)
    返回值:迭代器

    案例

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)

    执行

    [root@node10 python]# python3 test.py
    <enumerate object at 0x7f3c3f505750>

    使用迭代器

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)
    # Iterator 迭代器 Iterable 可迭代对象
    from collections import Iterator,Iterable
    print(isinstance(res,Iterator))
    print(list(res))

    执行

    [root@node10 python]# python3 test.py
    <enumerate object at 0x7f7851fc4750>
    True
    [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

    特别指定开始值是14 不是默认0

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)
    # Iterator 迭代器 Iterable 可迭代对象
    from collections import Iterator,Iterable
    print(isinstance(res,Iterator))
    print(list(res))
    
    
    res = enumerate(listvar,start=14)
    print(list(res))

    执行

    [root@node10 python]# python3 test.py
    <enumerate object at 0x7f04d1b42708>
    True
    [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
    [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]

    转换为字典

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)
    # Iterator 迭代器 Iterable 可迭代对象
    from collections import Iterator,Iterable
    print(isinstance(res,Iterator))
    print(list(res))
    
    
    res = enumerate(listvar,start=14)
    print(list(res),type(list(res)))
    #转换
    lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
    res = dict(lst)
    print (res)

    执行

    [root@node10 python]# python3 test.py
    <enumerate object at 0x7f2f5ceb3750>
    True
    [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
    [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
    {14: 'a', 15: 'b', 16: 'c', 17: 'd'}

    使用enumrate实现字典推导式

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)
    # Iterator 迭代器 Iterable 可迭代对象
    from collections import Iterator,Iterable
    print(isinstance(res,Iterator))
    print(list(res))
    
    
    res = enumerate(listvar,start=14)
    print(list(res),type(list(res)))
    
    lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
    res = dict(lst)
    print (res)
    
    dictvar = {a:b for a,b in enumerate(listvar,start=9)}
    print (dictvar)

    执行

    <enumerate object at 0x7f28329d1900>
    True
    [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
    [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
    {14: 'a', 15: 'b', 16: 'c', 17: 'd'}
    {9: 'a', 10: 'b', 11: 'c', 12: 'd'}

    可以直接使用dict强转

    listvar = ["a","b","c","d"]
    res = enumerate(listvar)
    print (res)
    # Iterator 迭代器 Iterable 可迭代对象
    from collections import Iterator,Iterable
    print(isinstance(res,Iterator))
    print(list(res))
    
    
    res = enumerate(listvar,start=14)
    print(list(res),type(list(res)))
    
    lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
    res = dict(lst)
    print (res)
    
    dictvar = {a:b for a,b in enumerate(listvar,start=9)}
    print (dictvar)
    
    res = dict(enumerate(listvar,start=10))
    print (res)

    执行

    <enumerate object at 0x7f54f8c10900>
    True
    [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
    [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
    {14: 'a', 15: 'b', 16: 'c', 17: 'd'}
    {9: 'a', 10: 'b', 11: 'c', 12: 'd'}
    {10: 'a', 11: 'b', 12: 'c', 13: 'd'}

    3.3.2 zip

    zip(iterable, ... ...)
        功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
        iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 
    返回: 迭代器
    
    # 注意:2个值得索引号需要相同,如果有余出的自动舍弃.

    案例

    from collections import Iterator,Iterable
    list1 = ["a","b","c","d"]
    list2 = [1,2,3,4,5,6,7,8,8,9,99,0,0]
    it = zip(list1,list2)
    print(isinstance(it,Iterator))
    print(list(it))
    #返回值 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    
    # 利用zip实现字典推导式
    dic = { k:v for k,v in zip(list1,list2) }
    print(dic)
    
    # 利用dict 强转zip迭代器变成字典
    res = dict(zip(list1,list2))
    print(res)

    执行

    [root@node10 python]# python3 test.py
    True
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
  • 相关阅读:
    适用于Bash编程初学者小例子
    Linux下的压缩与解压命令速查
    Linux下拷贝一个带有soft link的dir,会把被link的内容也拷贝过来吗?
    适用于Bash编程初学者小例子
    从一个git仓库迁移代码到另一个git仓库(亲测有效版)(转)
    海量数据面试题(附题解+方法总结)(转)
    leetcode刷题(六)路径总和I、II、III(转)
    浅谈AVL树,红黑树,B树,B+树原理及应用(转)
    [LeetCode] 860. Lemonade Change 买柠檬找零(转)
    [leetcode] 134. Gas Station 解题报告(转)
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/12287467.html
Copyright © 2011-2022 走看看