zoukankan      html  css  js  c++  java
  • python学习笔记(六)

    44、几种数据类型的比较

    python中几种常用的数据类型,列表,元组,字典,集合。

    相同点:(1)都能用for去遍历其中的元素;(2)列表和元组都能用下标引用,字典和集合不能用下表引用;(3)集合和字典都能同时更新多个元素,update;(4)列表是有序的,可以进行排序,集合中元素为同一数据类型时也是有序的,不同数据类型时是无序的;(5)列表和元组都能返回值的下标;(6)列表、字典、集合都有pop函数,但集合和字典的pop不能带参数,随机删除;(7)字典、元组、集合能用list命令直接转换为列表(字典转换后,key值变成列表中元素);(8)集合能将列表、元组、字典转变成去重的集合;

    45、统计一个列表中各个元素出现的次数,并按从大到小输出前N

    1)用sorted排序

    def dictSort1(list1,num):
        dict1={}
        for i in list1:
            if i not in dict1:
                dict1[i] = list1.count(i)

        list2=sorted(dict1.items(),key = lambda x:x[1],reverse=True)
        for j in range(num):
            print(list2[j][0])

    (2)用collections中的Counter排序

    from collections import Counter

    dictSort2(list1,num):

    C = Counter(list1)

        for i,(j,k) in enumerate(c.most_common(num),1):

            Print(“%d个元素为:%s,出现的次数为:%d”%(i,j,k))


    list2 = [2,2,5,5,7,7,4,5,9,11,9,4,4,2,4]
    dictSort1(list2,2)

    46、python中常见内建函数lambdareducemapfilter

    (1)lambda

    lambda常用的场景是在一个函数内需要再定义一个函数,而这个函数又比较简单(只有表达式,没有ifreturn等关键字)时,就可以用lambda直接定义并且调用,省去了一般函数需要先定义,再调用的麻烦。

    比如想对一个列表中的每个元素变为它的平方:

    list1 = list(map(lambda x:x**2,range(4))) //map是一个可迭代对象,可以转换为list对象

    如果用一般的函数来写就是:

    def fun(x):

    return x**2

    list1 = list(map(fun,range(4)))

    2map

    map是对一个可迭代对象中的每个元素进行同样的操作,如果可迭代的对象只有一个列表的话,map和列表推导式都能实现。如果可迭代对象是多个列表,则map和列表推导式不一样。

    还是上面的列子,将一个列表中每个元素变为它的平方。如果用列表推导式来写就是:

    list1 = [x**2 for x in range(4)]

    map表达:

    list1 = list(map(lambda x:x**2,range(4)))

    如果要处理的列表数为两个或者以上,就不一样了。比如,要生成一个新的列表,新列表中的元素为原来列表l1元素的平方,加列表l2元素。只能用map来完成:

    l3 =list( map(lambda x,y:x**2+y,range(1,4),range(3,7)))

    // l3 = [4, 8, 14]

    其中,列表l1和列表l2中元素的个数可以不一样多,最终以最少的那个为准。

    如果用列表推导式同样的书写,相当于是列表l1和列表l2中元素的笛卡尔积:

    l4 = [x**2+y for x in range(1,4) for y in range(3,7)]

    // l4 = [4, 5, 6, 7, 7, 8, 9, 10, 12, 13, 14, 15]

    3reduce(需要导入reducefrom functools import reduce)

    是对列表中元素按从左到右的方式依次做同样的处理。比如算一个数,10的阶乘:

    r1 = reduce(lambda x,y:x*y,range(1,11))

    // r1 = 3628800

    4filter

    filter实现对列表中元素的过滤,如果返回结果为真则保留,否则不保留。如,求一个列表中所有的偶数,并返回。

    def even(x):
        if x%2 == 0:
            flag = True
        else:
            flag = False
        return flag

    #可以简写为: return True if x%2==0 else False
    l1 = filter(even,range(-3,7))
    print(list(l1))

    // [-2, 0, 2, 4, 6]

    5)综合练习

    写一个函数,求一个列表中所有元素的阶乘的和。

    def sumSqua(l1):
        facs = []
        for i in l1:
            fac = reduce(lambda x,y:x*y,range(1,i+1))
            facs.append(fac)
        print(facs)
        l2 = reduce(lambda x,y:x+y,facs)
        return l2

    #还一个简洁的写法sum_ = sum([reduce(lambda x,y:x*y,range(1,z+1) for z in l)])

    sum_ = sum(map(lambda z:reduce(lambda x,y:x*y,range(1,z+1)),l))

    47、正则表达式

    (1)searchmatchfindall的区别

    match()string的开始位置进行正则匹配,即从0位置开始匹配,若匹配上则返回一个match对象,否则返回none

    search()函数扫描整个string,寻找第一个正则匹配的位置,若找到,则返回一个match对象,否则返回none

    MULTILINE模式下,match()函数只在第一行的string中进行匹配,而加了^限制的search()函数会在多行进行匹配。

    findall()方法将返回被查找字符串中的所有匹配:1)如果调用在一个没有分组的表达式上,将返回一个匹配字符串列表;2)如果调用在一个有分组的表达式上,将返回一个匹配字符串的元组的列表;3)如果字符串中没有相应的匹配,将会返回一个空列表。

    反向引用:

    import re

    text = "<h10>This is a good time.<h1> That is not a bad times. <h2>Print it and stop.<h2>"
    pattern1 = r'<h([1-6])>.*?<h1>'
    result1 = re.match(pattern1,text)
    if result1:
        print(result1.group())

    // 空

    pattern2 = r'^<h([1-6])>.*?<h1>'
    p2 = re.compile(pattern2,re.MULTILINE)
    result2 = re.search(p2,text)
    if result2:
        print(result2.group())

    // <h2>Print it and stop.<h2>

    result3 = re.findall(pattern1,text)
    print(result3)

    // ['2']

     

    (2)compile的作用

    compile有两个作用,一是,在匹配前编译好,执行匹配的时候,速度更快些;二是,compile后可以添加各种匹配模式的参数,如上面例子,re.MULTILINE表示多行匹配,re.I表示不区分大小写等。

    经过编译之后的匹配方式有两种写法:

        pattern2 = r'^<h([1-6])>.*?<h1>'
    p2 = re.compile(pattern2,re.MULTILINE)
    result2 = re.search(p2,text)

    pattern2 = r'^<h([1-6])>.*?<h1>'
    p2 = re.compile(pattern2,re.MULTILINE)
    result2 = p2.search(text)

  • 相关阅读:
    C# 读写xml
    oracle经验小节2
    解决在IE9,IE10浏览器下,程序没有任何错误,easy ui页面不加载任何数据的问题
    解决调试不能命中断点的问题
    在做和sap系统集成的一点心得
    easy ui datagrid 数据分页
    selector-item属性
    scaleType-模拟按钮加文字整天点击效果
    layout-代码中添加view
    linearlayout-weight 属性作用
  • 原文地址:https://www.cnblogs.com/yahutiaotiao/p/9956311.html
Copyright © 2011-2022 走看看