`

Python 食谱--1.3: 不用过多的引号来构造一个字典

阅读更多

不用过多的引用来构造一个字典 


问题 


你想构造一个不使用引号键值(key)的字典 


解决 

一旦你积极投入到python中来, 你可以发现你自己需要构造许多的字典。然而,标准的方法,也就是众所周知的字典的显示,比你想象的有一点点混乱。 因为它需要引用键值。 例如: 

data = { 'red' : 1, 'green' : 2, 'blue' : 3 }

 


当键值是标识符的时候,有一个更简洁的方法: 

def makedict(**kwargs): 
  return kwargs 

data = makedict(red=1, green=2, blue=3) 
 



你可能也选择去简化他们来获得更高的威力。例如: 

def dodict(*args, **kwds): 
  d = {} 
  for k, v in args: d[k] = v 
  d.update(kwds) 
  return d 


tada = dodict(*data.items( ), yellow=2, green=4) 
 

[译者:在python2.3中,tada = dodict(*data.items( ), yellow=2, green=4) 
不能执行。有一个语法错误] 

讨论
由于需要一定数量的引用,构造一个字典的语法有点乏味。这个配方展示了一种技术,在你写代码时你已经知道他们是标识符了,它可以避免引用键值。。 

我经常发现我自己会想念perl的=>操作符, 它很合适从一个文字列表中去建造一个hash(字典在perl里的说法)。 

%data = (red => 1, green => 2, blue => 3); 
 


 
Perl的=>操作符相当于perl的own(译注:不懂perl,不太明白), 除了它隐式引用一个它左边的单词。 


Perl的语法和python为传递一个keyword参数的函数调用语法非常相象。 并且,python收集keyword参数到一个字典里的事实给了我启发 


当你在python里声明一个函数的时候,你可以随意的决定具有*args 或者**kwds形式的正式的参数列表(如果你想他们两个一起使用,具有**形式的那个必须发放到最后)。 如果你有一个*args, 你的函数能被调用,并且它的特别实参的数量,位置,格式或者种类都是任意的。Python收集所有的特别的位置参数到一个
元组 并且绑定那个元组到标识符args。同样地,如果你有**kwds,你的函数也能被调用,他的特别实参的名字,或者关键字,种类都是任意的。 Python收集所有的特别的名字参数到一个字典里(名字作为键值,他的值作为字典的值)并且绑定这个字典到标识符kwds。 这个配方开发了一种方法,它让python知道怎么样执行后来的任务。 


Makedict函数应该是非常有效的,因为编译器正在做的工作相当于带着一个字典文字去做。不可否认那是一个惯用方法。但是他能让很大的字典文字更简洁,更少一些打字的痛苦。当你需要从一个具有key/item对的列表中构造一个字典, 而且有可能要覆盖,或者附加一些特别的命名键值的时候,dodict函数(尽管不太清楚和快速)也不失为一种便利方法。在python2.2中,dodict的前两行能被更简明和快速的等价物来替换: 

d = dict(args)
 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics