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)

原文地址:https://www.cnblogs.com/yahutiaotiao/p/9956311.html