标签:#标题:通过列表解析构建列表
#例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 L
myList1(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 izip
def 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就构建出一个值的键,而原先的键变成对应值的新字典,
"""
标签: