2011-04-18 50 views
0

说我有这段代码,我想在两个单独的字典上执行它。如何在不编写代码两次的情况下轻松完成此操作?我想我可以定义一个小函数,然后将每个字典传递给它。有没有更好的方法?同时在两个单独的字典上执行代码块

for key, value in self.mfiles.iteritems(): 
     if key not in self.INPUT['extras']: 
      self.mfiles[key] = self.dirs['confdir'] + '/' + value 

    for key, value in self.nmfiles.iteritems(): 
     if key not in self.INPUT['extras']: 
      self.nmfiles[key] = self.dirs['confdir'] + '/' + value 

回答

4

你可以这样做:

for data in (self.mfiles, self.nmfiles): 
    for key, value in data.iteritems(): 
     if key not in self.INPUT['extras']: 
      data[key] = self.dirs['confdir'] + '/' + value 

不过,我觉得写一个小功能可能更清晰。

+0

+1你快了10秒;-) – 2011-04-18 18:23:34

1

请其使用字典作为参数

class MyClass: 
    def doit(self, dictionary): 
     for key, value in dictionary.iteritems(): 
     if key not in self.INPUT['extras']: 
      dictionary[key] = self.dirs['confdir'] + '/' + value 
    def run(self): 
     self.doit(self.mfiles) 
     self.doit(self.nmfiles) 
0

写入其作为函数f然后map(f, [self.mfiles.iteritems, self.nmfiles.iteritems])的方法。

0

如果你知道self.mfilesself.nmfiles不共享相同的密钥,那么你可以做一个“合并”并迭代它。

for key, value in dict(self.mfiles, **self.nmfiles).iteritems(): 
    # do stuff 

否则,迭代每个单独:

for d in (self.mfiles, self.nmfiles): 
    for key, value in d.iteritems(): 
     # do stuff 
1

我会使用代码分解出到另一功能的组合和运行map上(其运行在所有项的函数在一个可迭代)所有你想变异的字典:

def doSomething(self, dic): 
    for key, value in dic.iteritems(): 
     if key not in self.INPUT['extras']: 
      dic[key] = self.dirs['confdir'] + '/' + value 

def runMe(self): 
     map(doSomething, [self.mfiles, self.nmfiles]) 
+0

在Python 3中,map产生一个迭代器而不是一个列表。因此,您将无法使用地图来获得像这样的副作用。 – 2011-04-18 20:44:48