#python cookbook第2版学习(都记录在此)

#标题:通过列表解析构建列表#例1:比如让列表中每一个子项增加某一个数,如下:def myList(L):    return ([x+20 for x in L])print myList([1,2,3,4,5,6,7,8])#例2:比如要查找列表中大于某个数的来构建成一个新列表,如下def myList(L):    return ([x for x in L if x>5])print myList([1,2,3,4,5,6,7,8])#对例1和例2进行合并, 如下:def myList(L):    return ([x+20 for x in L if x>5])print myList([1,2,3,4,5,6,7,8])#说明:当要考虑改变某个列表,而不是新建上列表时,列表解析是最好的方法,比如需要将某列表 L中大于100的设置成100,如下def myList1(L):    L[:]=[min(x,100)for x in L]    print LmyList1(list(range(90,102)))#注意:当执行一个循环时,不建议使用列表解析!#比如要复制一个列表,直接写成list(L)即可,还有当对每个元素进行调用一个函数是,使用map(f,L)#例3:对列表子项进行求和def myList(l):    return sum([x+20for x in l if x>5])print myList(range(20))#或者写成如下,不用括号def myList(l):    return sum(x+20for x in l if x>5)print myList(range(20))#这样做的原因是可以一次性将整个列表载入到内存

#给字典增加一个条目#标题:给定一个字典d,当k是字典的键,直接使用d[k],若k不是d键时,则创建这个新条目,如下def addWork(index,word,page):    index.setdefault(word,[]).append(page)
#反转字典#给定一个字典,此字典将不同的键映射到不同的值,而你想创建一个反转的字典,将各个值反映到键#通过dict列表解析式解决这个问题def invert_dict(d):    return dict([(v,k)for k,v in d.iteritems()])

print invert_dict({1:2,‘a‘:4})#对于比较大的字典,可以使用itertools模块的izip()from itertools import izipdef invert_dict(d):    return dict(izip(d.iteritems(),d.iterkeys()))print invert_dict({1:2,‘a‘:4})"""如果字典d中的值不中独一无二的,那么d无法被真正的反转,也就是不存在这样的字典,对于任意给定的键k,满足id[d[k]]==k,不过对于任意属于字典d值v,d[pd[v]]=v,如果给定你原始的字典d,就可以很检查出x是d反转字典还是伪反转字典:当且仅当len(x)==len(d)时,x才是d真正的反转字典因为如果2个不同的键对应相同的值,对于解决方案给出的2个函数来说,2个键中的一个一定会消失因而生成的伪反转字典长度也会比原字典长度短,在任意情况下,只有当d中的值是可哈希的,那么前面的函数就能正常工作,否则函数将给出一个typeerror异常这个函数取得了iteritems方法生成成对键及其他对应值k和v,将它们包裹成(v,k)顺序并把最后生成序列作为参数赋给dict,这样dict就构建出一个值的键,而原先的键变成对应值的新字典,"""
时间: 2024-10-10 01:05:41

#python cookbook第2版学习(都记录在此)的相关文章

python cookbook第三版学习笔记六:迭代器与生成器

假如我们有一个列表 items=[1,2,3].我们要遍历这个列表我们会用下面的方式 For i in items:   Print i 首先介绍几个概念:容器,可迭代对象,迭代器 容器是一种存储数据的数据结构,容器将所有数据保存在内存中,典型的容器有列表,集合,字典,字符数组等.如items就是一个列表容器.   可迭代对象:这个对象是否可迭代.如items也是一个可迭代对象.简单来说如果可以用for循环的对象都称为可迭代对象.如果要判断是否是一个可迭代的对象.可以用print isinsta

python cookbook第三版学习笔记七:python解析csv,json,xml文件

CSV文件读取: Csv文件格式如下:分别有2行三列. 访问代码如下: f=open(r'E:\py_prj\test.csv','rb') f_csv=csv.reader(f) for f in f_csv:     print f 在这里f是一个元组,为了访问某个字段,需要用索引来访问对应的值,如f[0]访问的是first,f[1]访问的是second,f[2]访问的是third. 用列索引的方式很难记住.一不留神就会搞错.可以考虑用对元组命名的方式 这里介绍namedtuple的方法.

python cookbook第三版学习笔记十三:类和对象(三)描述器

__get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法比较绕,我们来看一个实例: class Descriptor(object):     def __get__(self, instance, owner):         return 'get',self,instance,owner class T(object):     d=Descri

python cookbook第三版学习笔记五:datetime

Python中表示时间的模块是datetime,引入下面的模块 from datetime import datetime,timedelta print datetime.today()  #打印出当前的时间 E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py 2017-04-26 21:58:05.663000 我们还可以对时间进行加减操作.这里要用到timedelta模块 这个模块有5个重要参数分别是days,minutes,se

python cookbook第三版学习笔记三:列表以及字符串

过滤序列元素: 有一个序列,想从其中过滤出想要的元素.最常用的办法就是列表过滤:比如下面的形式:这个表达式的意义是从1000个随机数中选出大于400的数据 test=[] for i in range(1000):     test.append(random.randint(1,1000)) ret=[n for n in test if n >400] 根据cookbook书上的描述,这个方法适用于小数据的方式.如果数据集非常的大,而且要考虑内存的话建议使用生成器的方式ret=(n for

python cookbook第三版学习笔记二:字典

一般来说字典中是一个键对应一个单值的映射,如果想一个键值映射多个值,那么就需要将这些值放到另外的容器中,比如列表或者集合. 比如d={'a':[1,2]} Collections中的defaultdict模块会自动创建这样的字典.如下 d=defaultdict(list) d['a'].append(1) d['a'].append(2) d['b'].append(3) defaultdict(<type 'list'>, {'a': [1, 2], 'b': [3]}) 下面再来看下字典

python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性

先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候,会调用__getattr__,并执行其中的自定义代码.所有在类中定义的属性都包含在__dict__中,也就是说如果在__dict__中找不到对应的属性名,则__getattr__被触发. class get_try(object):     def __init__(self,value):   

python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法

在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object):     def spam(self):         print 'A.spam' class B(A):     def spam(self):         print 'B.spam'         A.spam(self) if __name__=='__main__':     b=B()     b.spam() 但是上面的代码有一个问题,如果B的父类变更了,而且有很多子类的父

python cookbook第三版学习笔记九:函数

接受任意数量参数的函数. 当传入函数的参数个数很多的时候,在函数定义的时候不需要为每一个参数定义一个变量,可以用*rest的方式来包含多余的参数. 如下面的代码,*rest包含了2,3,4这3个参数.且可以迭代访问.在这个例子中,rest其实就是其他位置参数组成的一个元组 def avg(first,*rest):     for i in rest:         print i     average=(first+sum(rest))/(1+len(rest))     print av