学习资料来自于ring翻译的python cook book.源贴于linuxforum ,此处只是记录我自己的一点理解

把一个键同多个值关联起来

d={}

添加: 1对多 列表  d.setdefault(‘key’,[]).append(value)

       11  字典 
d.setdefault(‘key’,{})[value]=1

删除: d[key].remove(value)  #1对多 只删除最前面的一个

       del
d[key][value]

       del
d[key][index]

获取: 1对多

       有返回列表,没有返回false

       def has_key_with_some_values( d, key):

            return d.has_key(key) and d[key]

       有返回列表,没有返回空列表。这个方法相对方便一些,因为返回类型一致

       def get_value_if_any( d, key):

            return d.get(key,[])

       11

       d[key].keys()

 

使用字典来分发Otter中曾经使用过getattr

必须先声明函数才能赋值

def do_dog(a,b):

    pass

….

f={‘dog’:do_dog,
‘cat’:do_cat, ‘bird’:do_bird}

f[‘dog’](a,b)
即可调用

也可以使用列表

F=[do_dog,do_cat,do_bird]

F[1](3,2)

 

发现两个集合的交集

d1={‘zope’:’test’,’python’:’test2’}

d2={‘python’:’test3’,’perl’:’$’}

使用filter

filter(d2.has_key,d1.keys())

使用list包含

[k for k in
d1 if k in d2]  # for k in d1
会隐式调用字典的iterkeys方法 if等价于has_key

 

Function
and a or b

条件如果成立返回a,否则返回b。可以没有or b 则返回false

3>0 and 1 or 0     1

3>4 and 1 or 0     0

3>4 and 1         false

 

用一个语句来赋值和测试

实现perl if x=foo():

通过自定义一个方法来实现。

技巧: __builtin__ 增加一个新的内建对象

import __builtin__

__builtin__.dataholder=dataholder

__builtin__.data=dataholder()

 

使用list包容代替map,filter  (ver>2.0)

l=[1,10,20,5,25]

列表中每个元素增加23

map(lambda
x:x+23 , l)

[k+23 for k
in l]

列出大于5的元素,返回列表

filter(lambda
x:x>5 , l)

[k for k in l
if k>5]

 

列出大于5的值且增加23

map(lambda
x:x+23 , filter( lambda x:x>5, l))

[k+23 for k
in l if k>5]  #
清晰,简洁。

   

   
List
包容来源于http://www.haskell.org

 

解包简单的类list对象

实际就是建立一个zip对应的unzip方法

zip([2,3,4],’hello’,(3,4,’as’))   => 
[(2,’h’,3),(3,’e’,4),(4,’l’,’as’)]

def unzip(p,
n):

    mlen, lft = divmod( len(p), n)  #技巧
divmod
直接获得商(整)及余

    if lft != 0 : mlen +=1

    lst=[[None]*mlen for I in range(n)]  #初始化,且效率高于append

    for I in range(len(p)):

        j , k = divmod( i , n )

            lst[k][j] = p[i]

       
return map(tuple, lst)    #
子序列tuple





2条评论

  1. 有一点要声明那个不是我翻译的,是rings翻译的,改过来吧。呵呵。

  2. 已改成。呵呵。

发表评论

评论也有版权!