2007-09-24

 

Python Cookbook 4.12 通过键,值交替的列表创建字典

需求:

你需要通过一个键,值对交替出现的列表创建字典.

讨论:

内建的dict类型提供了很多创建字典的方式,可是没有提供本节需求的解决方法,我们需要自己写函数来实现,一种方式是使用zip函数:
def dictFromList(keysAndValues):
return dict(zip(keysAndValues[::2], keysAndValues[1::2]))
另一种更一般的方式,可以适用与任何可迭代的对象,它将一个列表传递给两个迭代器,这是一个比较通用和迅速的方法:

def pairwise(iterable):
    itnext = iter(iterable).next
    while True:
        yield itnext( ), itnext( )

def dictFromSequence(seq):
    return dict(pairwise(seq))

定以pairwise也可以让其它的函数来使用它,比如mydict.update(pairwise(seq)).
上面的两种方面其实内在都使用了同样的构造字典的方式:在调用dict()的时候传递(key,value)的序列,不同之处是怎样构造这个值对序列.
dictFromList构造了键值对的列表,它使用了zip函数,使用了两个列表切片,一个是奇数, 一个是偶数.这样是可以工作的,不过有一个问题,就是参数必须是支持切皮的类型比如list,tuple,str等,而且,由于在内存里面使用了临时列表,当参数是很长的列表时,这样做会影响效率.
dictFromSequence和上面的方法不同,它将构造键值对的任务交给了pairwise函数.pairwise保证了任何可迭代的对象都可以工作,除了list,tuple和str外,还包括文件,字典等等.另外,pairwise一次只处理一对,并不使用临时队列,当输入队列很长的时候能改善效率.
pairwise的实现很有意思.在最开始的时候,它使用iter方法将参数构造为一个迭代器,并将next方法绑定给本地变量itnext,这样做看起来很奇怪,但这是Python中常用的方法:如果你使用一个对象,而且要循环调用这个对象的方法,你可以绑定它的方法,然后使用本地变量来表示那个方法.pairwise和下面这个写法的函数工作的结果是一样的,下面这个代码的写法在其它语言中是比较常见的:

def pairwise_slow(iterable):
    it = iter(iterable)
    while True:
        yield it.next( ), it.next( )

实际上,pairwise_slow版本的代码并不比pairwise简单多少,却比pairwise慢60%.我们建议程序员使用更Python的方式来写代码.不仅更简单,效率也会更高.


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?