zoukankan      html  css  js  c++  java
  • 内置函数(sorted、map、enumerate、filter、reduce)

    1、sorted()

    语法:

    sorted(iterable, cmp=None, key=None, reverse=False)

     把iterable中的items进行排序之后,返回一个新的列表,原来的iterable没有任何改变

    1、iterable:iteralbe指的是一个可迭代类型。iterable主要包括3类:

            第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。 
            第二类是一些非序列类型,比如dict(字典)、file(文件)。
            第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象。
    2、cmp: 指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
    3、key:指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
    4、reverse:是一个布尔值。如果设置为True,列表元素将被降序排列,默认为升序排列。
             通常来说,key和reverse比一个等价的cmp函数处理速度要快。这是因为对于每个列表元素,cmp都会被调用多次,而key和reverse只被调用一次。
    注意:
       列表本身还有自己sort方法,它的作用和sorted一样,都是用来排序的,但是sort方法是对原列表本地进行排序,而sorted方法是会生成一个新的列表,原列表内容不变
    
    示例:
    L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
    def f(x):
        return len(x)
    L.sort(key=f)  # 使用列表本身的sort的方法,修改原列表
    print(L)
    # 输出 :[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]
    
    L1 = sorted(L,key=f) # 使用sorted方法,返回一个新列表
    print(L1)
    # 输出 :[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]
    print(L)
    # 输出 :[{1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}, {1: 9}]

    list.sort()和sorted()方法都有一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。

    一个大小写不敏感的字符串比较:

    newStr = sorted("This is a test string from Andrew".split(), key=str.lower)
    print (newStr)
    # 输出 :['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

     key的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。这种技术比较快,原因在于对每个输入记录,这个函数只会被调用一次。

    对复杂对象的比较通常是使用对象的切片作为关键字。例如:

    student_tuples = [('Jerry', 'A', 15), ('Tom', 'C', 12),('Bill', 'B', 10)]
    sort_tuples = sorted(student_tuples, key=lambda student: student[2])  
    # 输出:[('Bill', 'B', 10), ('Tom', 'C', 12), ('Jerry', 'A', 15)]

    reverse实现降序排序,需要提供一个布尔值:

    list1 = [2,5,8,6,1,7,4,2,3]
    list2 = sorted(list1,reverse=False)
    print(list2)
    # 输出:[1, 2, 2, 3, 4, 5, 6, 7, 8]
    list3 = sorted(list1,reverse=True)
    print(list3)
    # 输出:[8, 7, 6, 5, 4, 3, 2, 2, 1]

    需要注意的是,在python3以后,sort方法和sorted函数中的cmp参数被取消,此时如果还需要使用自定义的比较函数,那么可以使用cmp_to_key函数。将老式的比较函数(comparison function)转化为关键字函数(key function)。与接受key function的工具一同使用(如 sorted(), min(), max(), heapq.nlargest(), itertools.groupby())。该函数主要用来将程序转成 Python 3 格式的,因为 Python 3 中不支持比较函数。

    2、map()

    map可以根据提供的函数对指定序列做映射,它接受一个函数 f 和一个 list ,并通过把函数 f 以此作用在 list 上的每个元素,然后返回一个新的list,map函数的入参也可以是多个.注意这个函数一定要有返回值。不然就会返回新的list 类似[None, None, None, None, None, None, None, None, None]

    示例:

    def fun(x):
        return x*x
    a = map(fun,[1,2,3,4,5])
    # print a
    # 输出结果:[1, 4, 9, 16, 25]
    # 像在python 2 当中使用这种打印方式完全没有问题
    # 但是在python 3 当中我们打印:
    # print(a)
    # 输出结果:<map object at 0x0000029F36872F28>
    # 得到的却是这样的一个内存地址,显然这不是我们想要拿到的结果,这也和python 3 发生的一些变化有关,如果我们想要打印出一个列表的话可以这样写
    # print(list(a))
    # 输出结果:[1, 4, 9, 16, 25]

    由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

    def format_name(s):
        s1=s[0:1].upper()+s[1:].lower()
        return s1
    
    print(list(map(format_name, ['adam', 'LISA', 'barT'])))
    # 输出结果:['Adam', 'Lisa', 'Bart']

    适合的场景是对列表里面的一些元素需要重复的操作,用map就可以轻松搞定.

    3、enumerate()

     在Python当中,如果我们使用正常的迭代只能取出内部的元素本身,而取不到元素的索引,而有的时候我们不仅需要取出元素还要取出元素的索引,能够在循环打印的时候让这个计数变量倍增,而enumerate方法就可以帮我们解决这个问题

    list1 = ['北京','上海','广州','深圳','武汉','郑州','西安']
    # 正常迭代:
    # for i in list1:
    #     print(i)
    #输出:   北京
    #        上海
    #        广州
    #        深圳
    #        武汉
    #        郑州
    #        西安
    # 使用普通方法:
    # i=0
    # for element in list1:
    #     list1[i] = "%d:%s"%(i,list1[i])
    #     i+=1
    # print(list1)
    # 输出:['0:北京', '1:上海', '2:广州', '3:深圳', '4:武汉', '5:郑州', '6:西安']
    
    # 使用enumerate():
    # for k,city in enumerate(list1):
    #     print(k,city)
    # 输出:0 北京
    #      1 上海
    #      2 广州
    #      3 深圳
    #      4 武汉
    #      5 郑州
    #      6 西安

    4、filter()

    filter函数接受一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回True或者False,这样可以过滤掉一些不符合条件的元素,然后返回符合条件的list.

    list_a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ]
    普通方法:
    def is_even(x):
        return x%2==0
    print(list(filter(is_even,list_a)))
    # 输出:[0, 2, 4, 6, 8, 10]
    
    使用filter和lambda 函数输出一下列表索引为奇数对应的元素;
    
    f=filter(lambda i:i%2 == 1,list_a)
    print(list(f))
    输出:[1, 3, 5, 7, 9]

    5、reduce()

    reduce函数的用法和map很类似,也是一个函数f和一个list,但是函数的入口参数一定要是两个,reduce也是对每个元素进行反复调用,最后返回最终的值,而map是返回一个list

    list_a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ]
    def add(x,y):
        return  x + y
    print(reduce(add,list_a))
    
    # 输出:55

    注意在python3里面reduce已经从全局函数里面移除了,需要用的话要from functools import reduce

    作者信息

    Sean

    Stay hungry,Stay foolish.

  • 相关阅读:
    BZOJ 1823: [JSOI2010]满汉全席 [2-SAT]
    POJ 3683 Priest John's Busiest Day[2-SAT 构造解]
    Centos出现-bash: unzip: command not found的解决办法
    物理cpu与逻辑cpu概述
    如何正确查看Linux机器内存使用情况
    connections java.net.BindException: Address already in use_解决方案
    Linux查看端口、进程情况及kill进程
    linux如何查看端口被哪个进程占用?
    如何正确查看Linux机器内存使用情况
    TPS和事务响应时间的关系
  • 原文地址:https://www.cnblogs.com/Yang-Sen/p/9147625.html
Copyright © 2011-2022 走看看