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中常见内建函数lambda、reduce、map、filter
(1)lambda
lambda常用的场景是在一个函数内需要再定义一个函数,而这个函数又比较简单(只有表达式,没有if、return等关键字)时,就可以用lambda直接定义并且调用,省去了一般函数需要先定义,再调用的麻烦。
比如想对一个列表中的每个元素变为它的平方:
list1 = list(map(lambda x:x**2,range(4))) //map是一个可迭代对象,可以转换为list对象
如果用一般的函数来写就是:
def fun(x):
return x**2
list1 = list(map(fun,range(4)))
(2)map
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]
(3)reduce(需要导入reduce,from functools import reduce)
是对列表中元素按从左到右的方式依次做同样的处理。比如算一个数,10的阶乘:
r1 = reduce(lambda x,y:x*y,range(1,11))
// r1 = 3628800
(4)filter
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)search、match、findall的区别
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)